Получение 52 недель после результата подзапроса - PullRequest
0 голосов
/ 26 марта 2020

Из таблицы, содержащей продажи, я получил последнюю неделю этой таблицы. Это дает мне последнюю неделю, когда происходят продажи. «Дата» - это всегда первый день месяца, но это не имеет значения, реальные важные данные - это неделя и частичная_неделя. Результат прост:

+------------+---------+--------------+
|    Date    |  Week   | Partial_week |
+------------+---------+--------------+
| 2020-02-01 | 2020-09 | 2020M02W09   |
+------------+---------+--------------+

Давайте назовем это t1

У меня есть таблица с первым днем ​​каждого месяца, каждой недели и неполной недели с 2015 по 2025 (когда неделя в два месяца он делится на две неполные недели, которые имеют одинаковое число, но разные месяцы) Это выглядит так:

+------------+---------+--------------+
|    Date    |  Week   | Partial_week |
+------------+---------+--------------+
| 2020-02-01 | 2020-05 | 2020M02W05   |
| 2020-02-01 | 2020-06 | 2020M02W06   |
| 2020-02-01 | 2020-07 | 2020M02W07   |
| 2020-02-01 | 2020-08 | 2020M02W08   |
| 2020-02-01 | 2020-09 | 2020M02W09   |
| 2020-03-01 | 2020-09 | 2020M03W09   |
+------------+---------+--------------+

Давайте назовем это t2

Теперь мне нужно извлечь все в t2, которое находится между 1 и 52 неделями после моей недели, извлеченной в t1. (это должно получать меня каждые недели и неполные недели до 2021-09 года или около того).

Я думал о том, чтобы выбрать

'выбрать лучшую 52 отличную неделю от t2'

присоединиться к t1 и иметь условие where 'where t1.week

, а затем снова соединять все в t2, чтобы получать каждую частичную неделю тоже,

, но это не работает, потому что на каждой неделе значение t1.week равно нулю (я могу sh t1.week быть просто переменной, так как в ней всего одна строка ...)

Любые идеи приветствуются.

1 Ответ

1 голос
/ 26 марта 2020

Ваша логика c кажется близкой. Поместите начальный запрос в скалярный подзапрос, чтобы обработать его как переменную:

select *
from t2 
where t2.week >=
 ( select week from t1 -- i.e. your existing query to return the latest week 
 )
qualify 
   dense_rank()
   over (order by week) <= 52

Вы также можете переключиться на объединение:

select *
from t2 
join
 ( select week from t1 -- i.e. your existing query to return the latest week 
 ) as t1
on t2.week >= t1.week 
qualify 
   dense_rank() -- next 52 week & partial weeks
   over (order by t2.week) <= 52

Объяснение скалярного подзапроса может быть лучше.

...