我找不到符合我要做的事情的场景。
我有一个表包含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
在上面的示例中,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
使用上面的示例,我需要一个查询,准确显示第四条记录(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。
答案 0 :(得分:6)
UPDATE #Download SET PackageID = (
SELECT TOP 1 PackageID
FROM #subscription
WHERE userID = #Download.userID AND Date <= #Download.Date
order by Date desc
)
我认为它应该有用......
答案 1 :(得分:0)
由于您需要选择正确的订阅,我已将datediff添加到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)
)