Отдельный элемент с последней меткой времени и несколькими (или всеми) возвращенными столбцами - PullRequest
1 голос
/ 22 октября 2009

У меня есть таблица delivery_history, которая заполняется триггером:

id(guid)  order_number  delivery_number  haulier    timestamp(getdate())

          1             1234             haulier1   2009-10-08 8:34:00
          2             1235             haulier1   2009-10-09 9:15:00
          1             1234             haulier2   2009-10-10 9:20:00

Я хотел бы вернуть все столбцы, но я хочу видеть только уникальное значение delivery_number с последней отметкой времени, поэтому я хочу получить следующие данные:

          1             1234             haulier2   2009-10-10 9:20:00
          2             1235             haulier1   2009-10-09 9:15:00

До сих пор я пробовал каждую возможность и комбинацию ответов, опубликованных на этом сайте, и они либо не дают мне требуемых результатов, они ожидают, что я был разумным, и использовали инкрементный идентификатор, а не руководство Я использовал (сейчас есть три недели данных от триггера, и я не очень хочу их выгружать), или они ожидают Sql Server 2005 или выше.

Это будет работать на Sql Server 2000.

Спасибо заранее, Mark

Ответы [ 2 ]

2 голосов
/ 22 октября 2009

Мне не нравится потенциал для дубликатов здесь. Две строки с одинаковым номером_поставки могут иметь одинаковую метку времени. Это может быть маловероятно, учитывая частоту поставок и поведение вашего приложения, но я не хотел бы полагаться на это для правильности.

Эта версия использует TOP 1 и допускает произвольное количество тай-брейков:

select * from delivery_history a
where id = (
  select top 1 id 
  from delivery_history b
  where a.delivery_number = b.delivery_number
  order by b.timestamp desc [, tie breaking col1, col2, ... colN]
  )
1 голос
/ 22 октября 2009
SELECT order_number, delivery_number, haulier, timestamp
  FROM delivery_history dh1
 WHERE timestamp = (SELECT max(dh2.timestamp)
                      FROM delivery_history dh2
                     WHERE dh2.delivery_number = dh1.delivery_number)
...