我正在努力计算客户订阅(“套餐”)的变化。为此,我每天都会从包裹表中选择一次所有数据。我调用每日查询结果“快照”(约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
如何更改此查询以仅产生不同的结果?
答案 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中一天不同的记录。
但是,要回到该方法,不需要获取所有数据的完整副本。您还有许多其他选项可以实现更高效的数据存储,其中一些是:
package_id
,那么您现在只会在表中为已更改的用户提供行。然后,使用这些数据集中的任何一个,为了满足报告要求,您可以填充多维数据集。您的源代码是一组包含user_id,old_package_id,new_package_id和date的行。您将创建一个包含这些度量的度量值组:
此度量组可能与以下维度相关: