SQL使用另一个表中的最新数据更新一个表 - 有条件的

Mik*_*250 3 sql t-sql subquery sql-update

我找不到符合我要做的事情的场景.

我有一个表保存UserID,他们的Subscription PackageID和他们的订阅日期.

用户ID 14525398的#Subscription示例数据:

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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,6月16日,此人订阅了PackageID 188535. 6月23日,他们升级到PackageID 188536.

在另一个表中,我有他们的下载历史记录,但我想要做的是从他们下载的日期得到他们订阅的PackageID.此下载表具有UserID,下载数量,下载日期和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
Run Code Online (Sandbox Code Playgroud)

使用上面的示例,我需要一个查询,准确显示第四条记录(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
)
Run Code Online (Sandbox Code Playgroud)

然而,这只是不准确地将它们全部设置为188535.如上所述,2011-06-24的下载应设置为PackageID 188536.

任何帮助将不胜感激.SQL Server 2008.

Zoh*_*aib 6

UPDATE #Download SET PackageID = (
  SELECT TOP 1 PackageID
  FROM #subscription
  WHERE userID = #Download.userID AND Date <= #Download.Date 
  order by Date desc
)
Run Code Online (Sandbox Code Playgroud)

我认为应该有效......