【发布时间】:2016-03-13 23:02:57
【问题描述】:
我正在寻找的输出是每一天的记录,其中包含 DISTINCT 活跃成员数和 DISTINCT 滚动 7 天活跃成员数。
我正在使用两个表 - [transactions] 记录了通过我们系统进行的每笔交易,包括交易处理日期的 dmn_date_id 和 1990 年至 2020 年之间的每一天的 DATE_DIMENSION,其中 day_offset_nbr 代表从 TODAY() 偏移的天数(此表每晚重建)。
SELECT
dd.date_tms
, COUNT(DISTINCT(t.user_id)) as Active_Members_Today
, COUNT(DISTINCT(t2.user_id)) as Rolling_7Day_Active_Members
FROM
transactions t
JOIN DATE_DIMENSION dd
ON t.transaction_processed_date_id = dd.date_id
JOIN DATE_DIMENSION d2
ON d2.day_offset_nbr BETWEEN (dd.day_offset_nbr - 6) AND dd.day_offset_nbr
JOIN transactions t2
ON d2.dmn_date_id = t2.common_trans_processed_date_id
WHERE
t.user_initiated_ind = 'Y' -- Only User-initiated Transactions
AND t2.user_initiated_ind = 'Y'
AND t.transaction_state_name = 'Accepted' -- Accepted Transactions Only
AND t2.transaction_state_name = 'Accepted'
AND dd.day_offset_nbr >= -731
AND d2.day_offset_nbr >= -738
GROUP BY
dd.date_tms
上面的查询让我得到了我们需要的东西,但是需要很长时间(一个多小时)来处理。我们已经在 user_initiated_ind 和 common_trans_processed_date_id 上创建了索引,包括 user_id,但查询仍在进行中。
我想我可以用窗口函数解决这个问题,据悉你不能在窗口中使用 DISTINCT,这导致我使用带有 Row_Number() 的派生表来识别窗口内的 DISTINCT 用户,这让我发现Row_Number() 不能与窗口中的 ROWS BETWEEN 子句一起使用...
我读过Calculate running total / running balance,这很相似,但处理的是运行余额而不是滚动不同的计数,我不太确定如何将我读到的内容应用于我的问题;只是建议我使用的 INNER JOIN 方法不是要使用的方法...
...这激发了我发帖的灵感。
如何提高查询性能时间?
【问题讨论】:
-
您的执行计划是否表明它正在使用没有额外查找的索引查找?
-
不,先生,@tab-alleman -- 聚集索引扫描一直向下。
标签: sql sql-server count distinct moving-average