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



我找不到一个与我想要做的事情相匹配的场景。

我有一个表,其中包含UserID、他们的SubscriptionPackageID和他们的Subscription日期。

用户ID 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

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

在另一个表中,我有他们的下载历史记录,但我想做的是导出他们在下载日期订阅的PackageID。这个下载表有UserID、Number of Downloads、download Date和PackageID,但没有我需要更新的值。

#下载表的示例数据为:

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 188 535上。

我试着这样更新:

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

然而,这只是不准确地将他们全部设定为188535人。如前所述,2011-06-24上的下载应该设置为PackageID188536。

如有任何协助,我们将不胜感激。SQL Server 2008。

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

我认为它应该起作用。。。

由于您需要选择正确的订阅,我在where子句中添加了datediff,以便您选择与下载日期相比最近的订阅日期

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)
)

最新更新