Sql-Server

計算然後更新每天數據的最大值的最緊湊方法是什麼?

  • October 2, 2015

我有一個數據庫,用於儲存每捆材料的記錄。從每捆中取出一個樣本並送去進行化驗(鉛和硫)。我收到化驗數據並將化驗值寫入記錄。我還取每個化驗的最大值並將它們分配給當天的“樣本”記錄。

一般來說,我一次只接受一天的化驗。然而,有時,我收到了多天的化驗(如果有重新化驗或化驗被延遲)。發生這種情況時,我最終會為所有包含的日期分配最大值,而不是分別為每一天分配最大值。

設置以下查詢以防止將一天的化驗作為另一天的最大值包含在內的更好方法是什麼?

UPDATE pOut
SET
pOut.lead_ppm = (SELECT MAX(p1.lead_ppm)
FROM production p1,  assay_temp t1
WHERE (p1.tank = 'B' or p1.tank = 'C')
AND p1.scheduled_pull_date = t1.formatted_date),
pOut.sulfur_ppm = (SELECT MAX(p2.sulfur_ppm)
FROM production p2,  assay_temp t2
WHERE (p2.tank = 'B' or p2.tank = 'C')
AND p2.scheduled_pull_date = t2.formatted_date) 
FROM production pOut, assay_temp tOut
WHERE pOut.tank = 'S'
AND pOut.cell_num = 1
AND pOut.scheduled_pull_date = tOut.formatted_date

程式碼已更新為使用不同命名的別名並包含所需的括號。我相信現在我可能會從最早的日期收到鉛和硫的單一最大值。我需要改進這一點,以便我每天通過化驗獲得最大值,並將該值寫入正確日期的“樣本”記錄。

我不完全確定,但如果聚合結果應該是每個日期並且日期是production.scheduled_pull_date,那麼可能是這樣的:

UPDATE
 pOut
SET
 pOut.lead_ppm = (
   SELECT
     MAX(p1.lead_ppm)
   FROM
     dbo.production AS p1
   WHERE
      (p1.tank = 'B' or p1.tank = 'C')
      AND p1.scheduled_pull_date = pOut.scheduled_pull_date
 ),
 pOut.sulfur_ppm = (
   SELECT
     MAX(p2.sulfur_ppm)
   FROM
     dbo.production AS p2
   WHERE
     (p2.tank = 'B' or p2.tank = 'C')
     AND p2.scheduled_pull_date = pOut.scheduled_pull_date
 )
FROM
 dbo.production AS pOut,
 dbo.assay_temp AS tOut
WHERE
 pOut.tank = 'S'
 AND pOut.cell_num = 1
 AND pOut.scheduled_pull_date = tOut.formatted_date
;

雖然我也會使用現代語法重寫連接:

FROM
 dbo.production AS pOut
 INNER JOIN dbo.assay_temp AS tOut ON pOut.scheduled_pull_date = tOut.formatted_date
WHERE
 pOut.tank = 'S'
 AND pOut.cell_num = 1

assay_temp子查詢中似乎根本不需要,而不是匹配子scheduled_pull_date查詢formatted_date應該與外部查詢相關。由於您希望按日期進行聚合,因此在我看來子查詢應該與pOut.scheduled_pull_date.

引用自:https://dba.stackexchange.com/questions/116833