SQL Server查询:每日数据快照比较(计算增量出现次数)
我正在计算客户订阅(“套餐”)的变化。为此,我每天从包表中选择一次所有数据。我将每日查询结果称为“快照”(约500k行)。然后,我将快照数据加载到一个新表中。10天后,快照表中总共有500万行(500k行*10天)。大多数客户不更改套餐(65%)。我需要报告其余35%的客户中,哪些是更换包的客户,他们何时更换包,他们正在进行哪些包更改(从“包X”更改为“包y”),以及哪些客户最频繁地更换包 我编写的查询使用了SQL Server查询:每日数据快照比较(计算增量出现次数),sql,sql-server,join,Sql,Sql Server,Join,我正在计算客户订阅(“套餐”)的变化。为此,我每天从包表中选择一次所有数据。我将每日查询结果称为“快照”(约500k行)。然后,我将快照数据加载到一个新表中。10天后,快照表中总共有500万行(500k行*10天)。大多数客户不更改套餐(65%)。我需要报告其余35%的客户中,哪些是更换包的客户,他们何时更换包,他们正在进行哪些包更改(从“包X”更改为“包y”),以及哪些客户最频繁地更换包 我编写的查询使用了自连接。我正在识别更改,但我的结果包含重复的行 这是我的疑问: select * fr
自连接
。我正在识别更改,但我的结果包含重复的行
这是我的疑问:
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的同时将行写入该表。这样,在运行复制作业之前,您将得到与第一个项目符号大致相同的结果
- 用户标识的不同计数
- 开关计数(基本上只是源数据的行计数)
- 日期,以便您可以看到开关何时发生
- 用户,这样您就可以深入了解谁正在切换
- 开关类型,它是从源数据中选择旧\u包\u id和新\u包\u id生成的维度。这使您能够看到特定变化的流行程度