Rob*_*Rob 3 sql t-sql sql-server self-join
我正在尝试(有效地)从连接表中获取行,其中startdate是cpid中的最新行 - 对于选定的cpid.
这是一个连接表中数据的示例,其中我想要用<<<标记的行
connid cpid startdate
1 20 7/17/16
2 20 8/23/16
3 20 9/12/16 <<<
4 30 6/17/16
5 30 8/23/16 <<<
6 40 2/24/16
7 40 3/17/16
8 40 5/18/16 <<<
etc...
Run Code Online (Sandbox Code Playgroud)
此查询返回最新的startdate和cpid,但我不确定如何将其与自身连接以获得我需要的结果:
select cpid, max(startdate)
from connections
where cpid in (
20,
30,
40
)
group by cpid
Run Code Online (Sandbox Code Playgroud)
我正在寻找的结果如下:
connid cpid startdate
3 20 9/12/16
5 30 8/23/16
8 40 5/18/16
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!
ROBM
像这样的东西:
WITH Numbered AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY cpid ORDER BY startdate DESC) AS Nr
,*
FROM connections
)
SELECT *
FROM Numbered
WHERE Nr=1;
Run Code Online (Sandbox Code Playgroud)
该函数ROW_NUMBER()将向行添加运行编号.PARTITION BY允许您重新启动组的运行编号,并ORDER BY允许您定义编号的顺序.随着DESC你将获得最新的,因此Nr = 1.
如果你需要在SQL-Server以外的其他系统上使用它,你可能会采用传统的方式:
SET DATEFORMAT mdy;
DECLARE @tbl TABLE(connid INT, cpid INT, startdate DATE);
INSERT INTO @tbl VALUES
( 1,20,'7/17/16')
,(2,20,'8/23/16')
,(3,20,'9/12/16')
,(4,30,'6/17/16')
,(5,30,'8/23/16')
,(6,40,'2/24/16')
,(7,40,'3/17/16')
,(8,40,'5/18/16') ;
SELECT *
FROM @tbl AS tbl
WHERE tbl.startdate IN(SELECT MAX(x.startdate) FROM @tbl AS x WHERE x.cpid=tbl.cpid)
Run Code Online (Sandbox Code Playgroud)