Возвращение самой последней строки SQL Server - PullRequest
0 голосов
/ 28 июня 2018

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

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 голосов
/ 28 июня 2018

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

select t.*
from Test t
where LastModified = (select max(t1.LastModified) from Test t1 where t1.OrderID = t.OrderID);
0 голосов
/ 28 июня 2018

Как насчет использования 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);
0 голосов
/ 28 июня 2018

Ответ «xcvd» идеально подходит для этого, я просто хотел бы добавить другое решение, которое можно использовать здесь, чтобы показать вам метод, который можно использовать в более сложных ситуациях, чем этот. Это решение использует вложенный запрос (подзапрос), чтобы найти MAX (LastModified) независимо от любого другого поля, и он будет использовать результат в предложении WHERE исходного запроса, чтобы найти любые результаты, которые соответствуют новым критериям. Приветствия.

SELECT OrderID
    , Person
    , LastModified
FROM Test
WHERE LastModified IN (SELECT MAX(LastModified)
                       FROM Test)
0 голосов
/ 28 июня 2018

Расширение вашего комментария ( "большое спасибо, есть ли способ, которым я могу сделать это, если существует более одного orderID, например, несколько человек и последний изменен для нескольких orderID?" ), в ответе 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;
0 голосов
/ 28 июня 2018

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