我有这张桌子
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 |
答案 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);