Menolak Nilai Susutan daripada Berbilang Lot
Masalah ini melibatkan memperuntukkan sumber yang semakin berkurangan (Kuantiti Digunakan) merentas berbilang lot inventori (Pooled_Lots) sambil menjejaki kuantiti terkumpul, baki permintaan dan sebarang lebihan atau defisit.
Struktur Data:
Kami mempunyai dua meja:
Hasil yang Diingini:
Pertanyaan harus menghasilkan set hasil untuk setiap lot dalam Pooled_Lots
, termasuk:
Pool
, Lot
, Quantity
, QuantityConsumed
, RunningQuantity
, RemainingDemand
, SurplusOrDeficit
.Pendekatan Penyelesaian:
Ungkapan Jadual Biasa (CTE) rekursif menyediakan penyelesaian yang berkesan. Logiknya adalah seperti berikut:
RunningQuantity
dengan menolak QuantityConsumed
jika lot Quantity
melebihi baki QuantityConsumed
.RemainingDemand
sebagai perbezaan antara QuantityConsumed
dan jumlah RunningQuantity
dan lot semasa Quantity
.SurplusOrDeficit
sebagai perbezaan antara RunningQuantity
dan RemainingDemand
.Pertanyaan SQL (Ilustratif):
Pertanyaan yang diberikan tidak lengkap dan mengandungi beberapa ketidakkonsistenan logik. Penyelesaian yang teguh memerlukan pengendalian yang teliti bagi kes tepi (cth., QuantityConsumed
sifar atau melebihi jumlah kuantiti semua lot dalam kumpulan). Pertanyaan yang diperbetulkan dan lebih cekap perlu dibuat berdasarkan sistem pangkalan data tertentu (cth., SQL Server, PostgreSQL, MySQL). Berikut ialah garis konsep pendekatan yang lebih tepat:
<code class="language-sql">WITH RecursiveCTE AS ( -- Anchor member: Select the first lot for each pool SELECT PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, PL.Quantity AS RunningQuantity, CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity ELSE PC.QuantityConsumed - PL.Quantity END AS RemainingDemand, 0 AS SurplusOrDeficit, ROW_NUMBER() OVER (PARTITION BY PL.Pool ORDER BY PL.Lot) as rn FROM Pooled_Lots PL LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId WHERE PL.Lot = 1 --First lot UNION ALL -- Recursive member: Process subsequent lots SELECT PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, CASE WHEN r.RemainingDemand > PL.Quantity THEN r.RunningQuantity - PL.Quantity ELSE r.RunningQuantity - r.RemainingDemand END AS RunningQuantity, CASE WHEN r.RemainingDemand > PL.Quantity THEN r.RemainingDemand - PL.Quantity ELSE 0 END AS RemainingDemand, CASE WHEN r.rn = (SELECT MAX(rn) FROM RecursiveCTE WHERE Pool = PL.Pool) THEN r.RunningQuantity - r.RemainingDemand ELSE 0 END AS SurplusOrDeficit, r.rn + 1 FROM Pooled_Lots PL INNER JOIN RecursiveCTE r ON PL.Pool = r.Pool AND PL.Lot = r.rn + 1 LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId ) SELECT * FROM RecursiveCTE ORDER BY Pool, Lot;</code>
Keputusan:
Output akan menunjukkan butiran setiap lot, termasuk kumulatif RunningQuantity
, baki RemainingDemand
dan mana-mana SurplusOrDeficit
selepas peruntukan. Ketepatan pengiraan RunningQuantity
, RemainingDemand
dan SurplusOrDeficit
bergantung pada logik tepat yang dilaksanakan dalam CTE rekursif untuk mengendalikan semua senario yang mungkin. Penyelesaian yang lengkap dan teruji memerlukan mengetahui sistem pangkalan data khusus dan data yang berpotensi menjadi sampel untuk pengesahan.
Atas ialah kandungan terperinci Bagaimana untuk Menolak Nilai Mengurangkan daripada Berbilang Baris Sambil Mengekalkan Nilai Terkumpul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!