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

SQL Server查询:每日数据快照比较(计算增量出现次数),sql,sql-server,join,Sql,Sql Server,Join,我正在计算客户订阅(“套餐”)的变化。为此,我每天从包表中选择一次所有数据。我将每日查询结果称为“快照”(约500k行)。然后,我将快照数据加载到一个新表中。10天后,快照表中总共有500万行(500k行*10天)。大多数客户不更改套餐(65%)。我需要报告其余35%的客户中,哪些是更换包的客户,他们何时更换包,他们正在进行哪些包更改(从“包X”更改为“包y”),以及哪些客户最频繁地更换包 我编写的查询使用了自连接。我正在识别更改,但我的结果包含重复的行 这是我的疑问: select * fr

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

我编写的查询使用了
自连接
。我正在识别更改,但我的结果包含重复的行

这是我的疑问:

select *
 from UserPackageDump UPD1, UserPackageDump UPD2
 where UPD1.user_id = UPD2.user_id
 and UPD1.package_id <> UPD2.package_id
选择*
从UserPackageDump UPD1到UserPackageDump UPD2
其中UPD1.user\u id=UPD2.user\u id
和UPD1.package_id UPD2.package_id
如何更改此查询以只生成不同的结果

选择
SELECT 
  DISTINCT *
FROM 
  UserPackageDump UPD1 
JOIN UserPackageDump UPD2
  ON UPD1.user_id = UPD2.user_id
WHERE 
  UPD1.package_id <> UPD2.package_id
明显的* 从…起 UserPackageDump UPD1 加入UserPackageDump UPD2 在UPD1.user\u id=UPD2.user\u id上 哪里 UPD1.package\u id UPD2.package\u id
您有很多选择,我不确定您的方法是否正确。首先,为了回答您的特定问题,您可以根据@sqlab的回答执行一个不同的测试。或者,您可以在联接中包含日期,确保UDP1仅与UDP2中的记录匹配,该记录与UDP2中的记录相差一天

然而,回到方法上来,不需要获取所有数据的完整副本。对于更高效的数据存储,您还有很多其他选择,其中包括:

  • 在数据库中放置一个“LastUpdated”datetime2字段,该字段将在每次更改行时填充。仅复制上次更新的行比上次复制时更新的行。假设表的唯一可能更改是更改
    包id
    ,那么现在表中只有已更改用户的行
  • 创建UserPackageHistory表,用户每次订阅包时,都会在更新UserPackage的同时将行写入该表。这样,在运行复制作业之前,您将得到与第一个项目符号大致相同的结果
然后,使用这些数据集中的任何一个,为了满足报告要求,可以填充多维数据集。您的源将是一组包含用户id、旧包id、新包id和日期的行。您将创建一个包含以下度量值的度量值组:

  • 用户标识的不同计数
  • 开关计数(基本上只是源数据的行计数)
然后,该度量值组可以与以下维度相关:

  • 日期,以便您可以看到开关何时发生
  • 用户,这样您就可以深入了解谁正在切换
  • 开关类型,它是从源数据中选择旧\u包\u id和新\u包\u id生成的维度。这使您能够看到特定变化的流行程度

看看您的查询,我认为使用DISTINCT应该可以解决您的问题。从userpackagedump中选择distinct*。您应该查看更改数据捕获,而不是提取所有记录以查找更改,我认为这将使更改更容易。