我一直在努力整个下午工作 - 这似乎很简单,但我必须错过一些东西!过滤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