Sql server 2005 SQL查询,按外键顺序按日期选择前2名
我需要一个SQL查询,按每个ClientID的PlanDate返回前2个计划。这一切都在一张桌子上,其中PlanID是PrimaryID,ClientID是异化的 这就是我目前所拥有的->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条记录
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