Показать полный диапазон дат с NULL в PostgreSQL - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь создать этот запрос, чтобы получить всю полную дату по диапазону и данные с нулевыми значениями, если дата не существует в таблице

Например, это мой tbl_example

Исходные данные:

id | userid(str) | comment(str) | mydate(date)
1     0001          sample1      2019-06-20T16:00:00.000Z
2     0002          sample2      2019-06-21T16:00:00.000Z
3     0003          sample3      2019-06-24T16:00:00.000Z
4     0004          sample4      2019-06-25T16:00:00.000Z
5     0005          sample5      2019-06-26T16:00:00.000Z

Затем:

select * from tbl_example where mydate between '2019-06-20' AND
DATE('2019-06-20') + interval '5 day')

как вывести все даты в диапазоне с возможным нулевым значением, как это

Ожидаемый результат:

id | userid(str) | comment(str) | mydate(date)
1     0001          sample1      2019-06-20T16:00:00.000Z
2     0002          sample2      2019-06-21T16:00:00.000Z
null  null          null         2019-06-22T16:00:00.000Z
null  null          null         2019-06-23T16:00:00.000Z
4     0003          sample3      2019-06-24T16:00:00.000Z
5     0004          sample4      2019-06-25T16:00:00.000Z 

Это мой пример среды тестирования: http://www.sqlfiddle.com/#!17/f5285/2

Ответы [ 2 ]

1 голос
/ 13 июня 2019

ОК, просто посмотрите мой SQL, как показано ниже:

with all_dates as (
select generate_series(min(mydate),max(mydate),'1 day'::interval) as dates from tbl_example
)
,null_dates as (
select
    a.dates
from
    all_dates a
left join
    tbl_example t on a.dates = t.mydate
where
    t.mydate is null
)
select null as id, null as userid, null as comment, dates as mydate from null_dates
union
select * from tbl_example order by mydate;
 id | userid | comment |       mydate        
----+--------+---------+---------------------
  1 | 0001   | sample1 | 2019-06-20 16:00:00
  2 | 0002   | sample1 | 2019-06-21 16:00:00
    |        |         | 2019-06-22 16:00:00
    |        |         | 2019-06-23 16:00:00
  3 | 0003   | sample1 | 2019-06-24 16:00:00
  4 | 0004   | sample1 | 2019-06-25 16:00:00
  5 | 0005   | sample1 | 2019-06-26 16:00:00
(7 rows)

Или в предложении generate_series вы можете просто указать желаемые аргументы даты, как показано ниже:

select generate_series('2019-06-20 16:00:00','2019-06-20 16:00:00'::timestamp + '5 days'::interval,'1 day'::interval) as dates
1 голос
/ 13 июня 2019
SELECT id, userid, "comment", d.mydate
    FROM generate_series('2019-06-20'::date, '2019-06-25'::date, INTERVAL '1 day') d (mydate)
    LEFT JOIN tbl_example ON d.mydate = tbl_example.mydate

Результат


...