GROUP BY子句的TOP N问题

时间:2009-04-16 19:45:08

标签: tsql select group-by greatest-n-per-group

问题:我需要找到最后三个[GiftDetails]的零活动[GiftPledges]。

SELECT gp.PledgeId FROM GiftPledge gp
      INNER JOIN GiftDetail gd ON gp.PledgeId = gd.PledgeId
      WHERE gp.PledgeStatus = 'A'
      GROUP BY PledgeId
      HAVING COUNT(PledgeId) >= 3

现在,我的所有[GiftPledges]至少有三个[GiftDetails]。

SELECT TOP 3 gdi.Amt FROM GiftDetail gdi
      INNER JOIN GiftHeader ghi ON gdi.GiftRef = ghi.GiftRef
      WHERE gdi.PledgeId = gp.PledgeId
      ORDER BY ghi.GDate DESC

这给了我与给定[GiftPledge]相关的最近三个[GiftDetails]。问题是我不知道如何对第二个查询求和,并让它成为第一个查询中WHERE子句的一部分。

我发现this article关于“每个组的前n个”并且似乎就像我需要前进的方向,但我不确定我是否在正确的轨道上。

非常感谢任何帮助,澄清或建议。

1 个答案:

答案 0 :(得分:2)

SELECT gp.PledgeId FROM GiftPledge gp
      INNER JOIN GiftDetail gd ON gp.PledgeId = gd.PledgeId
      WHERE gp.PledgeStatus = 'A'
      GROUP BY PledgeId
      HAVING COUNT(PledgeId) >= 3 
AND
GP.PledgeID in (
SELECT PledgeID From
(
SELECT TOP 3 gp.PledgeID, gdi.Amt  FROM GiftDetail gdi
      INNER JOIN GiftHeader ghi ON gdi.GiftRef = ghi.GiftRef
      WHERE gdi.PledgeId = gp.PledgeId
      ORDER BY ghi.GDate DESC
) x_amt 
Group By PledgeID
Having SUM(AMT) ) x_sum = 0

无论如何都是这样的。