Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL查询,按外键顺序按日期选择前2名_Sql Server 2005_Greatest N Per Group_Sql - Fatal编程技术网

Sql server 2005 SQL查询,按外键顺序按日期选择前2名

Sql server 2005 SQL查询,按外键顺序按日期选择前2名,sql-server-2005,greatest-n-per-group,sql,Sql Server 2005,Greatest N Per Group,Sql,我需要一个SQL查询,按每个ClientID的PlanDate返回前2个计划。这一切都在一张桌子上,其中PlanID是PrimaryID,ClientID是异化的 这就是我目前所拥有的-> SELECT * FROM [dbo].[tblPlan] WHERE [PlanID] IN (SELECT TOP (2) PlanID FROM [dbo].[tblPlan] ORDER BY [PlanDate] DESC) 显然,这只会返回2条记录,而实际上每个ClientID最多需要2条记录

我需要一个SQL查询,按每个ClientID的PlanDate返回前2个计划。这一切都在一张桌子上,其中PlanID是PrimaryID,ClientID是异化的

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

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

显然,这只会返回2条记录,而实际上每个ClientID最多需要2条记录。

Edit,2011年12月。校正交叉涂抹溶液

试着两者兼而有之,看看什么是最好的

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


这可以使用行号来完成:

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

将您需要的任何其他列添加到“选择”中也可以获得这些列。

Hmm,谢谢,但我得到消息102,级别15,状态1,第5行附近的语法不正确。@Refracted Paladin:我的错误,应用表上需要别名有趣,您的第二个选项和Mark Byers选项都返回7062行。第一个选项返回21948行。关于差异的想法?@折射圣骑士:最终解决了!
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