我有一个查询,可以给我一个这样的表:
Person | Date_IN | Date_OUT | Structure
一年中,一个人多次执行ENTER和EXIT,ENTER和EXIT也可能是同一天。
我想在一年中的某一天计算每个结构中有多少人。
最终目标是在给定的时间(3月1日至3月31日)内,每个建筑物每天的总人数。
答案 0 :(得分:2)
我相信以下方法会起作用。假定您有一个日期表(由一列组成,其中包含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
答案 1 :(得分:0)
请在下面的查询中使用,数据按特定时间范围的结构分组。
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
答案 2 :(得分:0)
您说同一天和一个人不能有多个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;