我需要 SQL 查询表中 90 天的不同 ID 滚动计数,只计算出现 3 次或更多次(至少 3 次交互)的 ID

问题描述 投票:0回答:0

我有一个“交互”表,基本上每次 id 交互时都有一行。所以可以有很多重复的id:

id 互动日期
1651 2017 年 9 月 15 日下午 3:07
1366 2017 年 6 月 28 日,晚上 8:32
1366 2017 年 7 月 3 日下午 6:26
1366 2017 年 7 月 3 日下午 6:22
1212 2017 年 8 月 24 日下午 1:05
1366 2017 年 9 月 18 日上午 9:15

我需要滚动 90 天不同的 ID,但只计算在那 90 天内出现 3 次或更多次的 ID(高参与度)。我在将 1 天的 90 天回顾查询转换为滚动查询时遇到了麻烦,该查询针对一年中的每一天进行提取。

(顺便说一下,我从 Redshift 中提取数据)首先,我编写了一个 sql 查询,以获取过去 90 天内 ID 的不同计数,其中 ID 交互至少 3 次以进行计数:

WITH cte AS
(
SELECT
id
,COUNT(id) "Count"
FROM interactions
WHERE 1=1
    AND dateinteracted >= (current_date - 90)
    AND dateinteracted < current_date
GROUP BY id
HAVING COUNT(id) >= 3
)

SELECT
COUNT(DISTINCT(id)) "DistinctCount"
FROM cte

然后我尝试将其转换为滚动拉动。即,对于每一天,我都希望从前 90 天的参与度 >=3 中得到不同的计数。 (由于从不支持的 Amazon Redshift 中提取此数据,因此我无法使用带有 RANGE 的窗口函数):

WITH cte AS (
SELECT
    A.dateinteracted,
    A.id,
        (SELECT
            COUNT(B.id)
        FROM interactions AS B
        WHERE 1=1
        AND B.id = A.id
        AND B.dateinteracted >= (A.dateinteracted - 90)
        AND B.dateinteracted < A.dateinteracted
        ) AS RollingCount
FROM interactions AS A
)

SELECT
CAST(dateinteracted as Date) "Date",
COUNT( DISTINCT(id)) "DistinctCount"
FROM cte
WHERE 1=1
    AND RollingCount >= 3
GROUP BY 
    CAST(dateinteracted as Date)
ORDER BY 1 DESC

这段代码看起来很接近,但看起来少算了。我不是很肯定,但我认为问题在于,对于每一天,它只会回顾 90 天后恰好在那天出现的 ID,而不是从该日期开始的前 90 天的所有 ID。任何帮助都会非常感谢!

sql amazon-redshift having rolling-computation distinct-values
© www.soinside.com 2019 - 2024. All rights reserved.