SQL Server查询:每日数据快照比较(计算三角洲出现次数)

时间:2014-04-02 14:47:48

标签: sql sql-server join

我正在努力计算客户订阅(“套餐”)的变化。为此,我每天都会从包裹表中选择一次所有数据。我调用每日查询结果“快照”(约500k行)。然后,我将快照数据加载到新表中。 10天后,我在快照表中总共有500万行(500k行* 10天)。大多数客户不会更改套餐(65%)。我需要报告哪些客户,其余35%的客户正在切换软件包,何时切换软件包,他们正在进行哪些软件包更改(从“软件包X”到“软件包y”)以及哪些客户最常更换软件包。

我编写的查询使用self-join。我正在识别更改,但我的结果包含重复的行。

这是我的疑问:

select *
 from UserPackageDump UPD1, UserPackageDump UPD2
 where UPD1.user_id = UPD2.user_id
 and UPD1.package_id <> UPD2.package_id

如何更改此查询以仅产生不同的结果?

2 个答案:

答案 0 :(得分:0)

SELECT 
  DISTINCT *
FROM 
  UserPackageDump UPD1 
JOIN UserPackageDump UPD2
  ON UPD1.user_id = UPD2.user_id
WHERE 
  UPD1.package_id <> UPD2.package_id

答案 1 :(得分:0)

你有很多选择,我不确定你的方法是正确的。首先回答您的具体问题,您可以根据@ sqlab的答案执行DISTINCT。或者您可以在联接中包含日期,确保UDP1仅匹配UDP2中一天不同的记录。

但是,要回到该方法,不需要获取所有数据的完整副本。您还有许多其他选项可以实现更高效的数据存储,其中一些是:

  • 在数据库中放置一个“LastUpdated”datetime2字段,每次更改行时都要填充该字段。仅复制LastUpdated比上次复制时更新的行。假设表中唯一可能的更改是更改package_id,那么您现在只会在表中为已更改的用户提供行。
  • 创建UserPackageHistory表,每次用户订阅包时,在更新UserPackage的同时将行写入其中。这样就可以得到与第一个项目符号相同的结果,但是在运行复制作业之前。

然后,使用这些数据集中的任何一个,为了满足报告要求,您可以填充多维数据集。您的源代码是一组包含user_id,old_package_id,new_package_id和date的行。您将创建一个包含这些度量的度量值组:

  • user_id的明显计数
  • 开关计数(基本上只是源数据的行数)

此度量组可能与以下维度相关:

  • 日期,以便您可以查看交换机何时开始
  • 用户,这样您就可以深入了解谁正在切换
  • 切换类型,这是从源数据中选择old_package_id和new_package_id构建的维度。这使您能够看到特定班次的受欢迎程度。