Sql-Server

從具有特定最大值的行中選擇所有列

  • June 9, 2021

想像一下,我有下表:

我想MAX(AvgPrice)為每個項目選擇行,僅來自倉庫 01 和 02 (WhsCode)。

所以我想要的結果應該是這樣的:

我在原始程式碼中嘗試的是:

SELECT T0."ItemCode", T3."MinStock", T3."MaxStock", T3."AvgPrice"
FROM OITM T0
LEFT JOIN (SELECT 
           MAX(AvgPrice) AS AvgPrice,
           ItemCode,
           MinStock,
           MaxStock 
FROM OITW 
WHERE WhsCode = '01' OR WhsCode = '02' 
GROUP BY ItemCode,MinStock,MaxStock) T3 
ON T0."ItemCode" = T3."ItemCode"

但是,由於我還按 MinStock 和 MaxStock 進行分組,所以我當然會為每個項目設置重複值,因為每個 WhsCode 的 MinStock 和 MaxStock 幾乎永遠不會相同。

所以我要選擇的是 ItemCode、MinStock 和 MaxStock 僅用於帶有MAX(AvgPrice).

使用的方言是 SQL Server 2019。我對 SQL 很陌生,在現有文章中找不到答案。

您可以使用ROW_NUMBER()過濾到每組僅一行。

類似 a的PARTITION BY函式GROUP BY,除了它不合併行之外,結果是在每一行上計算的。然後我們過濾它。

如果您想包含並列結果,請切換到DENSE_RANK().

SELECT T0."ItemCode", T3."MinStock", T3."MaxStock", T3."AvgPrice"

FROM OITM T0

LEFT JOIN (
   SELECT 
           ROW_NUMBER() OVER (PARTITION BY ItemCode ORDER BY AvgPrice DESC) AS rn
           AvgPrice,
           ItemCode,
           MinStock,
           MaxStock 
   FROM OITW 
   WHERE WhsCode = '01' OR WhsCode = '02' 
) T3 
ON T0."ItemCode" = T3."ItemCode" AND T3.rn = 1

您可能會發現APPLY更快或更慢,具體取決於確切的查詢。

APPLY整個子查詢中(邏輯上)為外部查詢的每一行執行。您可以引用外部列,因此將其與外部表相關聯,因此沒有連接條件。

如果添加TOP,則還可以添加ORDER BY.

SELECT T0."ItemCode", T3."MinStock", T3."MaxStock", T3."AvgPrice"

FROM OITM T0

OUTER APPLY (
   SELECT TOP (1)    -- add WITH TIES if you want tied results
           AvgPrice,
           ItemCode,
           MinStock,
           MaxStock 
   FROM OITW T3
   WHERE (T3.WhsCode = '01' OR T3.WhsCode = '02')
       AND T0."ItemCode" = T3."ItemCode"
   ORDER BY AvgPrice DESC
) T3

注意連接條件的移動和向內的排序,以及正確的括號括起來OR。還要注意始終為每列指定表


我建議你選擇比and更好的別名T0``T3

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