我有一个场景,我希望通过获取SQL Server中的最大记录来返回3列。如下所示
ID PID PDATE Satus CANUMBERS
1 PS1 2015-08-05 12:20:49.627 0 1 CAA0322
2 PS2 2015-08-06 04:05:52.053 0 1 CAA0322
3 PS2 2015-08-07 07:17:32.653 1 1 CAA0322
在这种情况下,正在寻找的是获得每个PDate
的最大PID
,就像在任何时候输入的最后一个pid记录一样。
我尝试了以下内容:
SELECT
MAX(ID), PID, PDATE
FROM
TABLE1
GROUP BY
PID, PDATE ...
对pdate进行分组的问题是,它返回所有记录。我只想要每个PID的最大pdate,如
1 PS1 2015-08-05 12:20:49.627 0 1 CAA0322
3 PS2 2015-08-07 07:17:32.653 1 1 CAA0322
任何帮助,请
答案 0 :(得分:3)
您需要使用具有ROW_NUMBER()
窗口函数的CTE - 如下所示:
;WITH CTE AS
(
SELECT
ID, PID, PDATE, Satus, CANUMERS,
RowNum = ROW_NUMBER() OVER (PARTITION BY PID ORDER BY PDATE DESC)
FROM
dbo.YourTable
)
SELECT
ID, PID, PDATE, Satus, CANUMERS
FROM
CTE
WHERE
RowNum = 1
PARTITION BY
子句按照PID
列对您的数据进行分区,然后将每个分区的编号从1开始 - 因此RowNum = 1
的行是最近的每个PDATE
PID
降序排列 - 最新的第一行)
答案 1 :(得分:1)
使用ROW_NUMBER()
函数实现输出:
create table maxrecord
(
id int,
PID varchar(10),
pdate datetime,
statuss int,
CANUMBERS varchar(10))
insert into maxrecord values(1,'PS1','2015-08-05 12:20:49.627',1,'CAA0322'),
(2,'PS2','2015-08-06 04:05:52.053',1,'CAA0322'),
(3,'PS2','2015-08-07 07:17:32.653',1,'CAA0322')
;WITH CTE as
(
select row_number() over (partition by PID order by PDATE DESC) as ROWNUM ,* from maxrecord
)
select id ,
PID ,
pdate,
statuss ,
CANUMBERS
from CTE where ROWNUM=1
答案 2 :(得分:1)
另一个比CTE和窗口函数更简单的例子就是在子查询中加入最大分组,只返回匹配的行,如下所示:
SELECT *
FROM TABLE1 T1
JOIN
(SELECT MAX(ID) ID, MAX(PDATE) PDATE, PID -- Listing PID here is unnecessary, but makes the query easier to understand
FROM TABLE1
GROUP BY PID) SRC
ON SRC.ID = T1.ID AND SRC.PDATE = T1.PDATE
在SQLFiddle中查看它,here。
但是,如果有两个记录与最大日期相关联怎么办?你想要的只是一个(即最新的ID),还是所有与max相关的记录?
如果您也想要关系,请将选择更改为此。
SELECT *
FROM TABLE1 T1
JOIN
(SELECT MAX(PDATE) PDATE, PID
FROM TABLE1
GROUP BY PID) SRC
ON SRC.PDATE = T1.PDATE AND SRC.PID = T1.PID