SQL сервер - Получить новейшую запись о присоединении - PullRequest
1 голос
/ 17 января 2011

После прочтения Stackoverflow в течение некоторого времени, сегодня моя очередь задавать вопрос!

Структура таблицы
Это связано с запросом к базе данных SQL Server 2005. У меня есть следующая структура таблицы:

компоненты

  • ID

загрузка

  • ID
  • componententid (FK для компонентов # id)
  • downloaddate

импорт

  • ID
  • downloadid (FK to downloads # id)
  • состояние

Что я хочу получить
Я пытаюсь получить статус последней загрузки для каждого компонента.

Где я до сих пор
Я начал писать этот запрос, но мое соединение работает не очень хорошо:

SELECT c.id  
FROM components as c  
JOIN (    
  SELECT componentid, MAX(downloaddate) as downloaddate, id  
  FROM downloads  
  GROUP BY componentid, id   
) d ON d.componentid = c.id  
-- JOIN on imports here...

Моя проблема в том, что запрос, используемый для объединения, неверен. Поскольку мне нужно выбрать идентификатор для объединения, я добавил его в предложение group by и теперь получаю несколько записей для каждого компонентного элемента вместо самого последнего.

Вот что я получу, если выполню запрос в соединении самостоятельно.

componentid downloaddate            id

8882    2011-01-15 06:00:09.773 595862
8882    2011-01-16 06:00:09.847 598422
8882    2011-01-17 06:00:09.940 600971
8951    2010-11-15 03:00:22.550 450221
8951    2010-11-16 03:00:21.730 452431
8951    2010-11-17 03:00:21.920 454668
8961    2011-01-17 02:00:33.077 600532
8961    2011-01-17 02:00:59.070 600536
8983    2008-07-17 11:59:53.780 122
9005    2009-09-01 04:00:38.320 48918
9005    2009-09-02 04:00:36.260 49280

Вместо этого мне нужно что-то вроде этого:

componentid downloaddate            id

8882    2011-01-17 06:00:09.940 600971
8951    2010-11-17 03:00:21.920 454668
8961    2011-01-17 02:00:59.070 600536
8983    2008-07-17 11:59:53.780 122
9005    2009-09-02 04:00:36.260 49280

Кто-нибудь знает, как мне написать свое объединение, чтобы достичь ожидаемого результата?

Заранее большое спасибо

Ответы [ 2 ]

3 голосов
/ 17 января 2011

Возможно, вы могли бы решить эту проблему, используя функцию ROW_NUMBER:

SELECT componentid, ROW_NUMBER() OVER (PARTITION BY componentid ORDER BY downloaddate DESC) as rowno
FROM downloads  
WHERE rowno = 1
3 голосов
/ 17 января 2011

Вы не можете соотнести оператор JOIN.Вместо этого используйте APPLY:

SELECT c.id , d.downloaddate
FROM components as c  
APPLY (    
  SELECT componentid, MAX(downloaddate) as downloaddate  
  FROM downloads  
  WHERE componentid = c.id
) as d;

На самом деле вы также можете использовать JOIN (поскольку внутренний запрос фактически не коррелирован), но не группируйте по идентификатору, просто группируйте по компонентам:

SELECT c.id , d.downloaddate
FROM components as c  
JOIN (    
  SELECT componentid, MAX(downloaddate) as downloaddate  
  FROM downloads  
  GROUP BY componentid 
) as d ON c.id = d.componentid;

Обновлено :

SELECT *
FROM components as c  
APPLY (    
  SELECT TOP(1) componentid, downloaddate, id as downloadid
  FROM downloads  
  WHERE componentid = c.id
  ORDER BY downloaddate DESC
) as d
JOIN imports i on i.id = d.downloadid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...