Это не легко сделать эффективно.Счетчики DISTINCT не поддерживаются пошагово (если вы не идете по пути точных подсчетов DISTINCT, таких как HyperLogLog).
Кодирование в SQL легко, и попробуйте обычную индексацию и т. Д., Чтобы помочь.
Однако (возможно) невозможно кодировать с помощью функций OLAP ... не в последнюю очередь потому, что вы можете использовать ДИАПАЗОН МЕЖДУ SUM()
, COUNT()
, MAX()
и т. Д., Но не RANK () илиDENSE_RANK()
... так что просто используйте традиционный сопутствующий подвыбор
Сначала некоторые данные
CREATE TABLE T(D DATE,F CHAR(1),A CHAR(1));
INSERT INTO T (VALUES
('2018-10-10','X','A')
, ('2018-10-11','X','A')
, ('2018-10-15','X','A')
, ('2018-10-15','X','A')
, ('2018-10-15','X','B')
, ('2018-10-15','Y','A')
, ('2018-10-16','X','C')
, ('2018-10-18','X','A')
, ('2018-10-21','X','B')
)
;
Теперь просто выберите
WITH B AS (
SELECT DISTINCT D, F FROM T
)
SELECT D,F
, (SELECT COUNT(DISTINCT A)
FROM T
WHERE T.F = B.F
AND T.D BETWEEN B.D - 3 DAYS AND B.D + 4 DAYS
) AS DISTINCT_A_MOVING_WEEK
FROM
B
ORDER BY F,D
;
,например,
D F DISTINCT_A_MOVING_WEEK
---------- - ----------------------
2018-10-10 X 1
2018-10-11 X 2
2018-10-15 X 3
2018-10-16 X 3
2018-10-18 X 3
2018-10-21 X 2
2018-10-15 Y 1