Подсчет различных значений с перекрывающимися временными окнами - PullRequest
0 голосов
/ 08 мая 2018

Я работаю в Teradata 15, мои данные выглядят так: table1 (идентификатор пользователя, дата действия, тип активности)

, и меня просят подсчитать уникальных пользователей за 30-дневный период, заканчивающийся каждую субботу. Таким образом, код псевдо будет выглядеть так:

select count(distinct(userid)
from table1 
where activitydate between Saturday and Saturday - 30

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

Идеальные результаты будут выглядеть так:

уникальных пользователей по выходным

4/7/18 10000

4/14/18 15000

Я прочитал много постов о номерах строк и нескольких уровнях CTE, но мне не удается получить то, что мне нужно. Есть идеи?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать тип данных Teradata PERIOD и таблицу Sys_calendar.Calendar, чтобы соединить это:

WITH saturdays AS (
    SELECT PERIOD(calendar_date - INTERVAL '30' DAY, NEXT(calendar_date)) AS sat_period
    FROM Sys_Calendar."CALENDAR" 
    WHERE calendar_date BETWEEN DATE '2018-01-01' AND CURRENT_DATE
        AND day_of_week = 7
)
SELECT COUNT(DISTINCT userid) count_of_users, 
    END(sat_period) AS saturday_Date
FROM yourtable
    INNER JOIN saturdays ON 
        saturdays.sat_period CONTAINS yourtable.datefield
GROUP BY saturday_date

Запустите только этот CTE, и вы увидите, что там происходит. По сути, мы просто создаем дату PERIOD из sys_calendar для текущего года (измените этот диапазон дат, как вам будет удобно). PERIOD в teradata имеет срок действия, но не включает конечную дату в диапазоне, поэтому мы увеличиваем его на один день с помощью функции NEXT().

Как только периоды построены из таблицы sys_calendar, мы можем ВНУТРИ СОЕДИНИТЬ это обратно в вашу таблицу и агрегировать.

...