0

我需要一个 SQL 查询,按PlanDate每个 ClientID 返回前 2 个计划。这一切都在一张表上,其中PlanIDPrimaryIDClientID是一个 foreignID。

这是我目前所拥有的 -->

SELECT *
FROM [dbo].[tblPlan] 
WHERE [PlanID] IN (SELECT TOP (2) PlanID FROM [dbo].[tblPlan] ORDER BY [PlanDate] DESC)

显然,这仅返回 2 条记录,而我实际上需要最多 2 条记录ClientID

4

2 回答 2

5

这可以使用 ROW_NUMBER 来完成:

SELECT PlanId, ClientId, PlanDate FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY ClientId ORDER BY PlanDate DESC) rn, *
    FROM [dbo].[tblPlan]
) AS T1
WHERE rn <=2

将您需要的任何其他列添加到选择中以获取这些列。

于 2010-02-02T20:54:21.000 回答
3

编辑,2011 年 12 月。更正了 CROSS APPLY 解决方案

尝试两者,看看什么是最好的

SELECT *
FROM
  ( -- distinct ClientID values
   SELECT DISTINCT ClientID 
   FROM [dbo].[tblPlan]
  ) P1
  CROSS APPLY
  ( -- top 2 per ClientID 
   SELECT TOP (2) P2.PlanID
   FROM [dbo].[tblPlan] P2
   WHERE P1.ClientID = P2.ClientID
   ORDER BY P2.[PlanDate] DESC
  ) foo

或者

;WITH cTE AS (
  SELECT
     *,
     ROW_NUMBER () OVER (PARTITION BY clientid ORDER BY [PlanDate] DESC) AS Ranking
  FROM
     [dbo].[tblPlan]
)
SELECT * FROM cTE WHERE Ranking <= 2
于 2010-02-02T20:52:08.603 回答