如何每天查询数据

时间:2020-03-18 09:59:13

标签: sql oracle

我有一个带有两个表的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

我知道如何查询以确认该学生是否在特定日期注册。

对于给定的日期范围(例如,“ 2015年1月20日”至“ 2016年12月3日”),我需要查询该范围内每天的注册学生人数。

输出应为:

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

这应该使用sql或plsql完成,但是也允许通过应用程序进行数据操作(没有ORM,只有JDBC)。

4 个答案:

答案 0 :(得分:1)

据我了解,您的事件表存储了两个条目,一个用于注册,一个用于注销。

您要查找给定日期范围内每天的在职学生总数。

您可以使用以下代码:

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

干杯!

答案 1 :(得分:0)

根据您到目前为止发布的内容:

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

答案 2 :(得分:0)

select nvl(register_date, unregister_date) dt, count(register_date) - count(unregister_date) 
FROM t
group by nvl(register_date, unregister_date)

如果您要查询的是日期范围,并且取消注册发生在您的日期范围之后,则不会被提取

答案 3 :(得分:0)

您可以“取消透视”数据并使用累积计数:

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;

注意:这适用于单个学生的多个注册/注销。但是,这对于单个学生的重叠注册不起作用。