Получить последнюю строку, вставленную с помощью поля CreatedDate - PullRequest
1 голос
/ 04 мая 2009

Я пытаюсь вставить последнюю запись в таблицу SQL на основе ее CreatedDate. Например, в приведенной ниже таблице я хотел бы получить третий ряд.

A   B   C   2009-05-04 19:30:52.847
A   B   D   2009-05-04 19:30:55.050
A   B   E   2009-05-04 19:30:57.003

У меня есть рабочий запрос, но мне интересно, есть ли лучший способ достичь того же результата. Ниже приведены таблица, данные и запрос, которые я сейчас использую для своего теста. Есть ли лучший способ сделать это?

CREATE TABLE TestTable (
  ColumnA     NVARCHAR(10),
  ColumnB     NVARCHAR(10),
  ColumnC     NVARCHAR(10),
  CreatedDate DATETIME    DEFAULT Getutcdate())

INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'C');
INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'D');
INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'E');

SELECT *
FROM   TestTable
WHERE  CreatedDate = (SELECT   Max(CreatedDate)
                      FROM     TestTable
                      WHERE    ColumnA = 'A'
                               AND ColumnB = 'B'
                      GROUP BY ColumnA,
                               ColumnB) 

Спасибо!

Ответы [ 4 ]

2 голосов
/ 04 мая 2009

Вы также можете написать

SELECT top 1 *
FROM   TestTable
order by CreatedDate desc
1 голос
/ 10 февраля 2011

Мне нравится это решение для внешнего соединения - оно не произошло со мной. Но Показать примерный план выполнения оказалось, что это дороже, чем то, как я обычно решаю эту проблему. (Может быть связано с индексами на моей таблице - ваш пробег может отличаться) Попробуйте это:

SELECT
    T1.ColumnA,
    T1.ColumnB,
    T1.ColumnC,
    T1.CreatedDate
FROM
    dbo.TestTable T1
    JOIN (SELECT ColumnA,
                 ColumnB,
                 max(CreatedDate) MaxDate
          FROM
                 dbo.TestTable
          GROUP BY ColumnA,
                   ColumnB) T2
    ON  T1.ColumnA     = T2.ColumnA
    AND T1.ColumnB     = T2.ColumnB
    AND T1.CreatedDate = T2.MaxDate 
0 голосов
/ 11 февраля 2011
SELECT TOP 1 WITH TIES *
FROM TestTable
WHERE ColumnA = 'A'
  AND ColumnB = 'B'
ORDER BY CreatedDate DESC

Это на всякий случай, если есть дубликаты CreatedDate и вам нужны все.

В противном случае просто бросьте WITH TIES.

0 голосов
/ 04 мая 2009

Существуют различные способы снятия шкуры с этой кошкой. Некоторые, которые еще не были опубликованы:

SELECT
     T1.column_a,
     T1.column_b,
     T1.column_c,
     T1.created_date
FROM
     dbo.Test_Table T1
WHERE
     T1.column_a = 'A' AND
     T1.column_b = 'B' AND
     NOT EXISTS
     (
          SELECT
               *
          FROM
               dbo.Test_Table T2
          WHERE
               T2.column_a = T1.column_a AND
               T2.column_b = T1.column_b AND
               T2.created_date > T1.created_date
     )

или

SELECT
     T1.column_a,
     T1.column_b,
     T1.column_c,
     T1.created_date
FROM
     dbo.Test_Table T1
LEFT OUTER JOIN dbo.Test_Table T2 ON
     T2.column_a = T1.column_a AND
     T2.column_b = T1.column_b AND
     T2.created_date > T1.created_date
WHERE
     T1.column_a = 'A' AND
     T1.column_b = 'B' AND
     T2.column_a IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...