Взорвись и посчитай все предметы из колонки 2 дат - PullRequest
1 голос
/ 23 апреля 2019

Я хотел бы получить все возможные даты (в данном случае: event_day) и номер события, которое происходит между start_date и end_date.пожалуйста, посмотрите таблицу ниже

 ---------------------------------
 start_date |  end_date   |  event
 ---------------------------------
 2019-01-01 |  2019-01-04 | A 
 2019-01-02 |  2019-01-03 | B
 2019-01-01 |  2019-01-06 | C

, и я хочу запросить, чтобы получить число event_count за всю дату.пожалуйста, смотрите следующий результат

----------------------------
event_day |  event_count
----------------------------
2019-01-01 |   2
2019-01-02 |   3
2019-01-03 |   3
2019-01-04 |   2
2019-01-05 |   1
2019-01-06 |   1

Я читаю другие источники, но могу найти только как взорвать дату из 2 дат.Любая помощь здесь?Спасибо

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Вы можете использовать календарную таблицу , чтобы решить эту проблему:

SELECT date_value AS event_day, COUNT(*) AS event_count
FROM (
    SELECT ADDDATE('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) AS date_value
    FROM
        (SELECT 0 t0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0,
        (SELECT 0 t1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
        (SELECT 0 t2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
        (SELECT 0 t3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
        (SELECT 0 t4 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
) calendar INNER JOIN events ON calendar.date_value BETWEEN events.start_date AND events.end_date
WHERE calendar.date_value BETWEEN '2019-01-01' AND '2019-01-04' -- to filter for a specific date range.
GROUP BY date_value

демо на dbfiddle.uk

0 голосов
/ 23 апреля 2019
 select Calendar.Calndr_date , count(Calendar.Calndr_date) count_events
 from event_table
 join Calendar on
 Calendar.Calndr_date between  event_table.start_date and event_table.end_date
 group by Calendar.Calndr_date 

пожалуйста, обсудите, если возникнут проблемы.Пожалуйста, создайте таблицу календаря и вставьте данные календаря. enter image description here

0 голосов
/ 23 апреля 2019

Если вы используете postgres, вы можете сгенерировать таблицу календаря с помощью generate_series, в основном вам нужна таблица календаря, чтобы иметь возможность разбивать даты.

WITH a AS(
  Select '2019-01-01'::date as start_date  ,'2019-01-04'::date as  end_date union all
  Select '2019-01-02'::date , '2019-01-03'::date union all
  Select '2019-01-01'::date, '2019-01-06'::date 
  )
 Select t.date_generated,count(*) as event
 from a
 JOIN(Select date_generated
  from generate_series(date '2019-01-01',
                   date '2019-12-31',
                   interval '1 day') as t(date_generated)
   ) t
   ON t.date_generated between a.start_date and a.end_date
   group by t.date_generated
   order by t.date_generated
...