У меня есть эта таблица
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 |
Я хочу вернуть самую последнюю измененную строку, которая является первой строкой с «Сэм».
Теперь я могу использовать 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 |


Если вам всегда нужна только одна запись (последняя измененная) на 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
Не могли бы вы дополнить свой вопрос дополнительными примерами данных для этих случаев?
Ответ "xcvd" идеально подходит для этого, я просто хотел бы добавить еще одно решение, которое можно использовать здесь, чтобы показать вам метод, который можно использовать в более сложных ситуациях, чем этот. Это решение использует вложенный запрос (подзапрос) для поиска MAX (LastModified) независимо от любого другого поля, и он будет использовать результат в предложении WHERE исходного запроса, чтобы найти любые результаты, которые соответствуют новым критериям. Ваше здоровье.
SELECT OrderID
, Person
, LastModified
FROM Test
WHERE LastModified IN (SELECT MAX(LastModified)
FROM Test)
Расширяя ваш комментарий ("Большое спасибо, есть ли способ сделать это, если существует более одного идентификатора заказа, например, несколько человек и lastmodified для нескольких идентификаторов заказа?"), в ответе xcvd я предполагаю, что вы поэтому хотите:
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;
Как насчет использования 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);
вернуться к основам подхода;). +1 за это.
Вот еще один метод:
select t.*
from Test t
where LastModified = (select max(t1.LastModified) from Test t1 where t1.OrderID = t.OrderID);
Большое спасибо, есть ли способ сделать это, если существует более одного идентификатора заказа, например несколько человек и lastmodified для нескольких идентификаторов заказа?