返回最近的行SQL Server

时间:2018-06-28 14:53:03

标签: sql sql-server group-by

我有这张桌子

CREATE TABLE Test (
OrderID int,
Person varchar(10),
LastModified Date
);


INSERT INTO Test (OrderID, Person, LastModified)
VALUES (1,  'Sam', '2018-05-15'),
(1,  'Tim','2018-05-14'),
(1,  'Kim','2018-05-05'),
(1,  'Dave','2018-05-13'),
(1,  'James','2018-05-11'),
(1,  'Fred','2018-05-05');

选择*结果:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |
|       1 |    Tim |   2018-05-14 |
|       1 |    Kim |   2018-05-05 |
|       1 |   Dave |   2018-05-13 |
|       1 |  James |   2018-05-11 |
|       1 |   Fred |   2018-05-05 |

我希望返回最近修改的行,即带有“ Sam”的第一行。

现在我现在可以使用max返回最近的日期了,但是我如何汇总person列以返回sam?

寻找类似

的结果集
| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |

我跑了这个

SELECT 
OrderID,
max(Person) AS [Person],
max(LastModified) AS [LastModified]
FROM Test
GROUP BY 
OrderID

但这返回:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Tim |   2018-05-15 |

有人可以进一步建议我吗?谢谢

***更新

INSERT INTO Test (OrderID, Person, LastModified)
VALUES (1,  'Sam', '2018-05-15'),
(1,  'Tim','2018-05-14'),
(1,  'Kim','2018-05-05'),
(1,  'Dave','2018-05-13'),
(1,  'James','2018-05-11'),
(1,  'Fred','2018-05-05'),
(2,  'Dave','2018-05-13'),
(2,  'James','2018-05-11'),
(2,  'Fred','2018-05-05');

所以我会寻找这样的结果:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |
|       2 |   Dave |   2018-05-13 |

5 个答案:

答案 0 :(得分:4)

如果您总是希望每个OrderID仅保留一条记录(最新修改的记录),则可以这样做:

SELECT
      t2.OrderID
    , t2.Person
    , t2.LastModified

FROM (
    SELECT
          MAX( LastModified ) AS LastModified
        , OrderID

    FROM 
        Test

    GROUP BY
        OrderID
) t

INNER JOIN Test t2
    ON t2.LastModified = t.LastModified
    AND t2.OrderID = t.OrderID

答案 1 :(得分:1)

在xcvd的答案中扩展您的评论(“非常感谢,如果有多个orderID,例如多个人并且为多个orderID进行了最后修改,我可以这样做吗?” ,我假设您因此想要的是这样:

WITH CTE AS(
    SELECT OrderId,
           Person,
           LastModifed,
           ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY LastModified DESC) AS RN
    FROM YourTable)
SELECT OrderID,
       Person,
       LastModified
FROM CTE
WHERE RN = 1;

答案 2 :(得分:1)

仅使用TOP (1)ORDER BY怎么样?

SELECT TOP (1) t.*
FROM Test t
ORDER BY LastModified DESC;

如果每个orderid都需要此方法,那么这是SQL Server中的便捷方法:

SELECT TOP (1) WITH TIES t.*
FROM Test t
ORDER BY ROW_NUMBER() OVER (PARTITION BY OrderId ORDER BY LastModified DESC);

答案 3 :(得分:0)

“ xcvd's”答案是完美的选择,我只想添加另一个可以在此处使用的解决方案,以便向您展示可以在比此更复杂的情况下使用的方法。此解决方案使用嵌套查询(子查询)来查找MAX(LastModified),而不考虑其他任何字段,它将使用原始查询的WHERE子句中的结果来查找满足新条件的任何结果。干杯。

SELECT OrderID
    , Person
    , LastModified
FROM Test
WHERE LastModified IN (SELECT MAX(LastModified)
                       FROM Test)

答案 4 :(得分:0)

这是另一种方法:

select t.*
from Test t
where LastModified = (select max(t1.LastModified) from Test t1 where t1.OrderID = t.OrderID);