获取T-SQL中的Max记录

时间:2015-08-07 05:19:09

标签: sql-server tsql group-by max

我有一个场景,我希望通过获取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

任何帮助,请

3 个答案:

答案 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