Как запрашивать данные за каждый день - PullRequest
0 голосов
/ 18 марта 2020

У меня есть Oracle база данных с двумя таблицами:

  1. Студенты
  2. Регистрация событий - когда регистрируется студент, создается строка с датой регистрации и когда студент Отмена регистрации, создается строка с датой отмены регистрации.

Регистрация таблицы событий:

     ID   Student_ID    REGISTER_DATE   UNREGISTER_DATE
     1    1              30/6/2015
     2    1                             15/7/2015
     3    3              17/12/2015
     4    1              22/1/2016

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

Для заданного диапазона дат (например, «20-ЯНВ-2015» - «3-DE C -2016») мне нужно запросить количество зарегистрированных студентов на каждый день в диапазоне.

Вывод должен выглядеть следующим образом:

Date    Number_of_students
20/01/2015  32
21/01/2015  36
... ...
... ...
3/12/2016   67

Это должно быть сделано с sql или pl sql, но манипулирование данными с помощью приложения (ORM отсутствует, просто JDB C) также допускается.

Ответы [ 4 ]

1 голос
/ 18 марта 2020

Насколько я понял, в вашей таблице событий хранятся две записи: одна для регистрации и одна для отмены регистрации.

Вы хотите найти общее количество активных учащихся в заданном диапазоне дат для каждого дня.

Вы можете использовать следующий код:

WITH DATERANGE(IDATE) AS
(SELECT &&STARTDATE + LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= &&ENDDATE - &&STARTDATE + 1),
--
STUDENT_REGISTER(STU_ID, REGISTRATIONDATE, UNREGISTRATIONDATE) AS
(SELECT STU_ID, 
        MAX(CASE WHEN EVENT = 'REGISTARTION' THEN YOURDATECOLUMN END) AS REGDATE,
        MAX(CASE WHEN EVENT = 'UNREGISTARTION' THEN YOURDATECOLUMN END) AS UNREGDATE
   FROM REGISTER_EVENTS
 GROUP BY STU_ID)
--
SELECT DR.IDATE, COUNT(1) AS Number_of_students
  FROM DATERANGE DR
  JOIN REGISTER_EVENTS RE 
    ON DR.IDATE BETWEEN RE.REGISTRATIONDATE AND COALESCE(RE.UNREGISTRATIONDATE, DR.IDATE)
GROUP BY DR.IDATE

Cheers !!

0 голосов
/ 18 марта 2020

Вы можете «отменить вывод» данных и использовать кумулятивное число:

select dte, sum(sum(inc)) over (order by dte) as num_registered
from ((select register_date as dte, 1 as inc
       from register_events
      ) union all
      (select unregister_date, -1 as inc
       from register_events
      )
     ) re
where dte is not null
group by dte
order by dte;

Примечание. Это работает для нескольких регистраций / отмены регистрации для одного учащегося. Но это не работает для перекрывающихся регистраций для одного студента.

0 голосов
/ 18 марта 2020
select nvl(register_date, unregister_date) dt, count(register_date) - count(unregister_date) 
FROM t
group by nvl(register_date, unregister_date)

Если вы запрашиваете диапазон дат и отмена регистрации происходит после того, как диапазон дат не будет получен)

0 голосов
/ 18 марта 2020

Из того, что вы опубликовали до сих пор:

select date_column, count(*)
from register_events
where event = 'register'
  and date_column between date '2015-01-20' and date '2016-12-03'
group by date_column
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...