Возвращение самой последней строки SQL Server

У меня есть эта таблица

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 |
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
72
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если вам всегда нужна только одна запись (последняя измененная) на 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

Большое спасибо, есть ли способ сделать это, если существует более одного идентификатора заказа, например несколько человек и lastmodified для нескольких идентификаторов заказа?

Ryan Gadsdon 28.06.2018 17:05

Не могли бы вы дополнить свой вопрос дополнительными примерами данных для этих случаев?

xcvd 28.06.2018 17:06

Ответ "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 за это.

iSR5 28.06.2018 18:48

Вот еще один метод:

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

Другие вопросы по теме