我有一个带有两个表的Oracle数据库:
注册事件表:
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)。
答案 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;
注意:这适用于单个学生的多个注册/注销。但是,这对于单个学生的重叠注册不起作用。