Вы можете сделать это, сначала создав столбец, в котором каждый идентификатор указан только один раз, а затем выполните подсчет диапазона для этого столбца, например ::10000
WITH sd AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 1 ID, 20 val FROM dual UNION ALL
SELECT 2 ID, 30 val FROM dual UNION ALL
SELECT 2 ID, 40 val FROM dual UNION ALL
SELECT 4 ID, 50 val FROM dual UNION ALL
SELECT 4 ID, 60 val FROM dual UNION ALL
SELECT 6 ID, 70 val FROM dual)
SELECT ID,
val,
COUNT(id_distinct) OVER (ORDER BY ID RANGE 3 PRECEDING) cnt_disinct_ids
FROM (SELECT ID,
val,
CASE WHEN row_number() OVER (PARTITION BY ID ORDER BY val) = 1 THEN ID END id_distinct
FROM sd);
ID VAL CNT_DISINCT_IDS
---------- ---------- ---------------
1 10 1
1 20 1
2 30 2
2 40 2
4 50 3
4 60 3
6 70 2
ETA: доказательство того, что вышеуказанная техника работает для ваших данных:
WITH your_table AS (SELECT 'ABCDE' account_sk, 23 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 23 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 24 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 25 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 53 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 53 day_sk FROM dual UNION ALL
SELECT 'ABCDE' account_sk, 55 day_sk FROM dual UNION ALL
SELECT 'VWXYZ' account_sk, 10 day_sk FROM dual UNION ALL
SELECT 'VWXYZ' account_sk, 12 day_sk FROM dual UNION ALL
SELECT 'VWXYZ' account_sk, 40 day_sk FROM dual UNION ALL
SELECT 'VWXYZ' account_sk, 40 day_sk FROM dual)
SELECT account_sk,
day_sk,
COUNT(day_sk_distinct) OVER (PARTITION BY account_sk ORDER BY day_sk RANGE BETWEEN 29 PRECEDING AND CURRENT ROW) count_distinct_day_sk
FROM (SELECT account_sk,
day_sk,
CASE WHEN row_number() OVER (PARTITION BY account_sk, day_sk ORDER BY day_sk) = 1 THEN day_sk END day_sk_distinct
FROM your_table);
ACCOUNT_SK DAY_SK COUNT_DISTINCT_DAY_SK
---------- ---------- ---------------------
ABCDE 23 1
ABCDE 23 1
ABCDE 24 2
ABCDE 25 3
ABCDE 53 3
ABCDE 53 3
ABCDE 55 2
VWXYZ 10 1
VWXYZ 12 2
VWXYZ 40 2
VWXYZ 40 2