Netezza диапазон дат - PullRequest
       9

Netezza диапазон дат

0 голосов
/ 29 января 2019

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

В Netezza я хочу сгенерировать значение (date) и выполнить запрос для каждого указанного значения.Я хочу заменить все союзы в один запрос .

SELECT DISTINCT COUNT(DISTINCT a.x) AS NO_OF_X, a.column1, 'JAN 2019'
FROM my_table a
WHERE 1=1  
AND current_date BETWEEN a.date_from and a.date_to

GROUP BY 2,3  

UNION ALL

SELECT DISTINCT COUNT(DISTINCT a.x) AS NO_OF_X, a.column1, 'DEC 2018'
FROM my_table a
WHERE 1=1  
AND '2018-12-31' BETWEEN a.date_from and a.date_to
GROUP BY 2,3

UNION ALL

SELECT DISTINCT COUNT(DISTINCT a.x) AS NO_OF_X, a.column1, 'NOV 2018'
FROM my_table a
WHERE 1=1  
AND '2018-11-30' BETWEEN a.date_from and a.date_to
GROUP BY 2,3 

Я хочу сделать что-то вроде этого

SELECT DISTINCT COUNT(DISTINCT a.x) AS NO_OF_X, a.column1, last_day( date ) as "MONTH"
FROM my_table a
WHERE 1=1  
AND /*run the query for all last_days in a range */ 
GROUP BY 2,3 

Возможно ли это?Попытка сделать CTE, но действительно важно получить результаты для каждого конкретного последнего дня месяца, потому что наше хранилище данных предназначено для хранения различных временных интервалов для каждой транзакции и т. Д. И я хочу получать только транзакции с временными срезами для определенногоlast_day ().

Приветствия.

1 Ответ

0 голосов
/ 29 января 2019

Вам необходимо сформировать список дат.Вот один из методов:

select to_char(m.dte, 'MMM YYYY'), t.column1,
       count(distinct a.x) AS NO_OF_X
from (SELECT current_date as dte UNION ALL
      SELECT date_trunc('month', current_date) - interval '1 day' as dte UNION ALL
      SELECT date_trunc('month', current_date) - interval '1 day' - interval '1 month' as dte UNION ALL
      SELECT date_trunc('month', current_date) - interval '1 day' - interval '2 month' as dte
      ) m left join
      my_table t
where m.dte between t.date_from and t.date_to
group by to_char(m.dte, 'MMM YYYY'), t.column1
order by min(m.dte), t.column1;
...