Задать вопрос
@Kotsubid
Изучал front-end, теперь изучаю SQL/python

Как сделать агрегацию с окном «внахлест»?

Имеется набор данных. Упрощенно - это определенная дата и значение на эту дату.
Не могу сообразить, каким образом рассчитать агрегацию данных для каждой даты таким образом, чтобы группировка была не только по этой дате, но и по дополнительным датам -14 дней. Т.е. получается некая группировка с условием, которое эту партицию расширяет. При этом эти окна могут идти внахлест, т.е. одно и то же значение может участвовать при расчете агрегации на разные даты.
См. иллюстрацию, надеюсь так будет понятнее.
Посоветуйте пожалуйста, как сделать группировку или count over partition by по таким окнам? Или где про это почитать. 5c5bd52da8b4f542396675.png
  • Вопрос задан
  • 167 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
Vapaamies
@Vapaamies
Психанул и снес свои ответы не отмечающим решения…
Если поддерживается вашей СУБД, нужно использовать rows between (беру по вашему примеру):
count() over (partition by date rows between date and date - 14)

Могу ошибаться. Давно не использовал SQL на таком уровне, детали уже подзабыл...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Здесь отвечаю на вопросы.
Посоветуйте пожалуйста, как сделать группировку
Никак. Вы не указали по каким критериям выделены группы (картинки SQL не понимает). Сумма по группе подразумевает, что записи сгруппированы. Если нужно участие одной записи в нескольких суммах, делайте подзапрос.
попадаются строки не только этой даты, но и несколько ранних дат
Для каждой уникальной даты сделайте отдельный подзапрос.
SELECT DISTINCT [Table].[Date], 
  (SELECT Count(*) FROM [Table] AS [ts] 
      WHERE ts.[Date] BETWEEN [Table].[Date] AND DATEADD(d, -14, [Table].[Date]) 
            AND ts.[Check] = 1) AS CountCheck 
  FROM [Table]
Ответ написан
Если я правильно понял задачу, то есть в SQL оконные функции LAG и LEAD, погуглите их.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы