Как получить данные за последние X недель в redshift?

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

У меня есть запрос ниже, который я запускаю, дает мне единый счет за предыдущую неделю, который есть Week 44 . На данный момент текущая неделя составляет 45.

 with data_holder as
(
with tree_post as
(Select contractid as conid, max(goldennmber) as goldennmber
from zeus.user_keys_post group by contractid)
Select * from tree_post join zeus.user_keys_post b
on tree_post.conid = b.contractid and tree_post.goldennmber = b.goldennmber
),
 
name as 
(
SELECT abc, client_id, services from dim.crom c1 where c1.ver = (SELECT MAX(ver) from dim.crom c2 
where c1.client_id = c2.client_id)
)
 
select
count(distinct(clientid))
from data_holder
left join name
on name.client_id = data_holder.clientid
where POC NOT IN ('SGH', 'IKU')
and status IN ('NOTTAKEN')
and (fromWeek <= '44' AND toWeek >= '45')
  

На данный момент я вижу вывод, который относится к неделе 44-

 Count
-----
124 
  

Теперь я пытаюсь сделать этот запрос динамическим, чтобы он мог дать мне подсчет за последние 6 недель, начиная с 44 до 39, не включая текущую неделю, что-то вроде приведенного ниже в качестве вывода:

 Count   Week
------------
124     W44
125     W43
126     W42
127     W41
128     W40
129     W39
  

Итак, мое условие для каждой недели будет таким, если я буду запускать его вручную для каждой из этих недель —

 and (fromWeek <= '44' AND toWeek >= '45') // for week 44
and (fromWeek <= '43' AND toWeek >= '44') // for week 43
and (fromWeek <= '42' AND toWeek >= '43') // for week 42
and (fromWeek <= '41' AND toWeek >= '42') // for week 41
and (fromWeek <= '40' AND toWeek >= '41') // for week 40
and (fromWeek <= '39' AND toWeek >= '40') // for week 39
  

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

 with data_holder as
(
with tree_post as
(Select contractid as conid, max(goldennmber) as goldennmber
from zeus.user_keys_post group by contractid)
Select * from tree_post join zeus.user_keys_post b
on tree_post.conid = b.contractid and tree_post.goldennmber = b.goldennmber
),
 
name as 
(
SELECT abc, client_id, services from dim.crom c1 where c1.ver = (SELECT MAX(ver) from dim.crom c2 
where c1.client_id = c2.client_id)
)

select fromWeek,
count(distinct(clientid))
from data_holder
left join name
on name.client_id = data_holder.clientid
where POC NOT IN ('SGH', 'IKU')
and status IN ('NOTTAKEN')
and fromWeek <= date_part(w, current_date - interval '6 weeks') 
and toWeek >= date_part(w, current_date)
group by fromWeek
  

Примечание:

fromWeek а toWeek столбец — это целочисленный тип данных, и они содержат номер недели, просто к вашему сведению. Это устаревший запрос, поэтому я пытаюсь сделать его динамичным. Не уверен, почему у них одинарные кавычки около 44 и 45, но если я выполняю свой первоначальный ручной запрос, подобный этому and (fromWeek <= '44' AND toWeek >= '45') или этому and (fromWeek <= 44 AND toWeek >= 45) , на 44-й неделе, я всегда получаю те же данные, что и 124.

Комментарии:

1. Какой результат вы получаете?

2. Это ничего не дает мне, как я упоминал выше. Я делаю что-то не так в своем динамическом запросе?

3. как определяется fromWeek и toWeek ? Я не понимаю этого выражения (fromWeek <= '44' AND toWeek >= '45')

4. Я обновил свой вопрос. Это целочисленные типы данных, и поскольку это устаревший запрос, поэтому я пытаюсь сделать его динамичным. Не уверен, почему у них одинарные кавычки около 44 и 45, но если я выполняю свой первоначальный ручной запрос, подобный этому and (fromWeek <= '44' AND toWeek >= '45') или этому and (fromWeek <= 44 AND toWeek >= 45) , на 44-й неделе, я всегда получаю те же данные, что и 124.

5. Я не понимаю, как эти два столбца работают вместе, fromWeek <= '44' означает, что fromWeek может быть чем угодно от 0 до 44 и AND toWeek >= 45 означает, что это может быть что-то большее или равное 45. Почему это точно определяет неделю 44?

Ответ №1:

Разве вы не хотите, чтобы toWeek был на 1 больше, чем fromWeek? Если да, то ваши предложения where должны быть:

 ...
and fromWeek <= date_part(w, current_date - interval '6 weeks') 
and toWeek >= date_part(w, current_date - interval '5 weeks')
...
  

Я подозреваю, что у вас просто нет данных для значений для toWeek, которые достаточно высоки, чтобы передать ваше предложение toWeek where .