2016-11-09 3 views
2

Я работаю над запросом, чтобы ежедневно получать совокупный отчет количества uids.Совокупный отличный счет

Пример: Предположим, что на дату 2016-11-01 появилось 2 uids (100,200), и они также появились на следующий день с новым uid 300 (100,200,300) на 2016-11-02 На данный момент я хочу, чтобы накопительный кумулятивный счет будет 3 не 5, поскольку (идентификатор пользователя 100 и 200 уже появился в прошлый день).

Input table: 

    date   uid   
2016-11-01   100 
2016-11-01   200 
2016-11-01   300 
2016-11-01   400   
2016-11-02   100 
2016-11-02   200     
2016-11-03   300 
2016-11-03   400 
2016-11-03   500 
2016-11-03   600 
2016-11-04   700 

Expected query result: 

date   daily_cumulative_count 
2016-11-01    4 
2016-11-02    4 
2016-11-03    6 
2016-11-04    7 

До сих пор я получаю совокупный отчетный счет в день, но он включает в себя предыдущие отличительные показатели от предыдущего дня.

SELECT 
    date, 
    SUM(count) OVER (
    ORDER BY date ASC 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 
) 
FROM (
    SELECT 
    date, 
    COUNT(DISTINCT uid) AS count 
    FROM sample_table 
    GROUP by 1 
)ORDER BY date DESC; 

Любая помощь была бы принята с благодарностью.

ответ

1

Вы можете использовать exists, чтобы проверить, присутствует ли идентификатор в любой из предыдущих дат. Затем получите текущую сумму и найдите максимальное значение для каждой группы, которое даст вам ежедневный отчетный совокупный счет.

select dt, max(col) as daily_cumulative_count 
from (select t1.*, 
     sum(case when not exists (select 1 from t where t1.dt > dt and id = t1.uid) then 1 else 0 end) over(order by dt) col 
     from t t1) x 
group by dt 
1

Пожалуйста, попробуйте следующее ...

SELECT date AS date 
     COUNT(uid) AS daily_cumulative_count 
FROM (SELECT leftTable.date AS date, 
       rightTable.uid AS uid 
     FROM sample_table AS leftTable 
     JOIN sample_table AS rightTable ON leftTable.date >= rightTable.date 
     GROUP BY leftTable.date, 
       rightTable.uid 
    ) AS allUIDSForDateFinder 
GROUP BY date; 

Это утверждение начинается с присоединения одного экземпляра sample_table к другому таким образом, что каждая запись в leftTable имеет связанный с ним копию каждой записи от rightTable, который имеет более раннее или равное значение date. Это фактически привязывает список к каждому date всех значений uid, которые произошли вплоть до значения date.

Результирующий набор данных уточняется до уникальных комбинаций date и uid с использованием GROUP BY.

Уточненная набор данных из подзапросов allUIDSForDateFinder затем группируются по date от основного тела запроса, а через COUNT() из uid значения, связанные с каждой группой выполняется.

Если у вас есть какие-либо вопросы или комментарии, то, пожалуйста, не стесняйтесь оставлять комментарии соответственно.

Смежные вопросы