Sql-Server
從具有特定最大值的行中選擇所有列
想像一下,我有下表:
我想
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
。還要注意始終為每列指定表