SQL Обновление одной таблицы с самыми последними данными из другой таблицы - условно - PullRequest
3 голосов
/ 26 октября 2011

Я не мог найти сценарий, который соответствовал бы тому, что я пытаюсь сделать.

У меня есть одна таблица, в которой хранится идентификатор пользователя, идентификатор пакета подписки и дата подписки.

Пример данных для #Subscription for userID 14525398:

UserID      Package     Date
14525398    188535      2011-05-17 00:00:00.000
14525398    188535      2011-06-16 00:00:00.000
14525398    188536      2011-06-23 00:00:00.000

В приведенном выше примере 16 июня этот человек подписался на PackageID 188535. 23 июня он обновился до PackageID 188536.

В другой таблице у меня есть история загрузок, но я пытаюсь выяснить, на какой PackageID они были подписаны на дату их загрузки.В этой таблице загрузки есть идентификатор пользователя, количество загрузок, дата загрузки и идентификатор пакета без значения, которое мне нужно обновить.

Пример таблицы данных #Download:

UserID      Dloads  Date                PackageID
14525398    3       2011-06-18 00:00:00.000     0
14525398    2       2011-06-18 00:00:00.000     0
14525398    2       2011-06-19 00:00:00.000     0
14525398    5       2011-06-24 00:00:00.000     0
14525398    2       2011-06-18 00:00:00.000     0

ИспользованиеВ приведенном выше примере мне нужен запрос, который точно показывает, что четвертая запись (запись 5 загрузок) была в PackageID 188536, потому что это был самый последний пакет до даты загрузки 2011-06-24, тогда как остальная часть была бы в PackageID 188535.

Я попытался обновить следующим образом:

UPDATE #Download SET PackageID = (
SELECT TOP 1 PackageID 
FROM #subscription 
WHERE userID = #Download.userID AND Date <= #Download.Date
)

Однако это просто неверно устанавливает их все 188535. Как уже упоминалось, загрузки 2011-06-24 должны быть установлены как PackageID 188536.

Любая помощь будет принята с благодарностью.SQL Server 2008.

Ответы [ 2 ]

6 голосов
/ 26 октября 2011
UPDATE #Download SET PackageID = (
  SELECT TOP 1 PackageID
  FROM #subscription
  WHERE userID = #Download.userID AND Date <= #Download.Date 
  order by Date desc
)

Я думаю, что это должно работать ...

0 голосов
/ 26 октября 2011

Так как вам нужно выбрать правильную подписку, я добавил дату в предложение where, чтобы вы выбирали ближайшую дату подписки по сравнению с датой загрузки

UPDATE #Download SET PackageID = (
    SELECT TOP 1 PackageID 
    FROM #subscription 
    WHERE userID = #Download.userID 
    AND datediff(Date,#Download.Date) > 1
    orderby datediff(Date,#Download.Date)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...