подсчет вхождений между датами разных интервалов дат - PullRequest
0 голосов
/ 28 августа 2018

У меня есть запрос, который дает мне такую ​​таблицу:

 Person | Date_IN | Date_OUT | Structure

В течение года человек много раз входил и выходил, вход и выход также мог быть в один и тот же день.

Я бы хотел посчитать, на какой конкретный день года, сколько человек было В каждой структуре.

Конечная цель состоит в том, чтобы за данный период (1 марта -> 31 марта) получить общую сумму за каждый день для каждой структуры.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я считаю, что следующее будет работать. Предполагается, что у вас есть таблица дат (состоит из одного столбца, который содержит все даты между 1950 и 2050 годами), и вы просто объединяете ее с таблицей регистрации / выезда:

SELECT dates.date, Structure, COUNT(DISTINCT Person) Persons_on_That_Date
FROM dates
LEFT JOIN turndata ON dates.date BETWEEN Date_IN AND Date_OUT
WHERE dates.date BETWEEN '2018-03-01' AND '2018-03-31'
GROUP BY dates.date, Structure
ORDER BY Structure, dates.date

Демо Здесь

Примечание. Вышеприведенное предполагает, что дата выхода указана включительно (человек считается как внутри на эту дату). Если дата выхода является исключительной, то предложение ON становится:

... ON Date_IN <= dates.date AND dates.date < Date_OUT
0 голосов
/ 28 августа 2018

Вы говорите, что не может быть нескольких date_in для одного и того же дня и человека, потому что человек находится как минимум в одном дне. Таким образом, на определенную дату мы должны только посмотреть на последнее событие на человека до того времени, чтобы увидеть, был ли этот человек / был в тот день.

Это шаги:

  • создание набора данных для требуемых дней на лету
  • присоединиться к столу и получить последние date_in до этого дня на человека
  • снова присоединиться к таблице, чтобы получить последние записи
  • совокупность в день и количество присутствующих

Это:

select
  data.day
  sum(t.date_in is not null and (t.date_out is null or t.date_out = data.day)) as count_in
from
(
  select days.day, t.person, max(t.date_in) as max_date_in
  from (select date '2018-03-01' as day union all ...) days
  left join t on t.date_in <= days.day
  group by days.day, t.person
) data
left join t on t.person = data.person and t.date_in = data.max_date_in
group by data.day
order by data.day;
0 голосов
/ 28 августа 2018

Пожалуйста, используйте ниже запрос, данные сгруппированы по структуре для определенного периода.

SELECT structure, COUNT(DISTINCT person) as no_of_person
FROM table_name
WHERE DATE(Date_IN) BETWEEN '2018-08-01' AND '2018-08-31'
GROUP BY structure
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...