我一直在努力整個下午工作 - 這似乎很簡單,但我必須錯過一些東西!過濾SQL查詢返回的結果
我有一個查詢返回一些數據,它返回的兩列是「PackageWeight」和「PackageGroup」。從本質上講,我想過濾掉這些數據,以便每個「PackageGroup」只顯示一行 - 應該是「PackageWeight」列中值最高的那一行。
看起來很簡單,但我不能讓它在SQL Server中使用TOP 1和GROUP BY的組合工作。我肯定錯過了什麼!
SELECT VendorID, PackageID, PackageWeight, PackageGroup
FROM (SELECT VendorID, COUNT(*) AS qty
FROM VendorServices
GROUP BY VendorID
) cs
JOIN (SELECT PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup, COUNT(*) AS qty
FROM PackageServices
JOIN lookupPackages ON PackageServices.PackageID = lookupPackages.PackageID
GROUP BY PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup
) ps ON cs.qty >= ps.qty
WHERE (SELECT COUNT(*)
FROM VendorServices cs2
JOIN PackageServices ps2 ON cs2.ServiceTypeID = ps2.ServiceID
WHERE cs2.VendorID = cs.VendorID
AND ps2.PackageID = ps.PackageID
) = ps.qty
此查詢返回完整的數據集,我需要過濾。然而我的努力迄今未能:(
任何幫助非常讚賞
編輯 - 由於下面的貢獻者,到目前爲止,我有以下查詢:
with result_cte as
(
SELECT VendorID, PackageID, PackageWeight, PackageGroup,
RANK() over (partition by PackageGroup order by PackageWeight desc) as [rank]
FROM (SELECT VendorID, COUNT(*) AS qty
FROM VendorServices
GROUP BY VendorID
) cs
JOIN (SELECT PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup, COUNT(*) AS qty
FROM PackageServices
JOIN lookupPackages ON PackageServices.PackageID = lookupPackages.PackageID
GROUP BY PackageServices.PackageID, lookupPackages.PackageWeight, lookupPackages.PackageGroup
) ps ON cs.qty >= ps.qty
WHERE (SELECT COUNT(*)
FROM VendorServices cs2
JOIN PackageServices ps2 ON cs2.ServiceTypeID = ps2.ServiceID
WHERE cs2.VendorID = cs.VendorID
AND ps2.PackageID = ps.PackageID
) = ps.qty
)
select *
from result_cte
WHERE [rank] = 1
ORDER BY VendorID
到目前爲止,好,我仍然會看看@gbn提出的APPLY運算符,因爲這對我來說是新的 - 我仍然需要做一些測試來確保這個查詢在100%的時間內運行,但最初的跡象是好的!
感謝迄今爲止所做的貢獻。
編輯2 - 遺憾的是,在用更多示例數據填充數據庫後,此查詢失敗。它似乎錯過了一些條目。
也許我需要更多地解釋一下這裏發生了什麼。通過我的原始查詢返回的數據會列出系統中的每個客戶,以及派生的PackageID(由該查詢計算)以及在查找表中分配給該Package的權重和組。
我需要過濾原始結果表,這樣我才能從每個組中獲取不超過一個包,每個客戶(每個客戶可能有一個或多個組的包,但可能沒有每個組的包)
明天我會帶着更新的一面看,因爲我想我可能會在'看不到樹木的情況'!
謝謝大家。
的可能重複[SQL服務器上 - 選擇TOP 5行每個FK(http://stackoverflow.com/questions/1450603/sql-server-select-top-5-rows -for-each-fk)或http://stackoverflow.com/q/1164483/27535。還有幾十個:http://stackoverflow.com/questions/tagged/greatest-n-per-group – gbn
你使用的是什麼版本的SQL Server? – Lamak
@Lamak - SQL Server 2008. – JimmE