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;
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
此处演示 注:以上假设外出日期是包含在内的(该人在该日期被视为在内)。如果out date是独占的,则 ON 条款变成:
... ON Date_IN <= dates.date AND dates.date < Date_OUT
3条答案
按热度按时间vx6bjr1n1#
你说不能有多个
date_in
为了同一天和同一个人,因为一个人至少在一天之内。因此,对于给定的日期,我们只需查看每个人在此之前的最新事件,就可以确定此人是否在该日期。步骤如下:
为所需的实时天数创建数据集
和table一起吃最后一个
date_in
直到那天每人再次加入表以获取最后的记录
每天合计并计算出席人数
这是:
brtdzjyr2#
请使用下面的查询,数据按特定时间段的结构分组。
kknvjkwl3#
我相信下面的方法会奏效。它假设您有一个日期表(由一列组成,其中包含1950年到2050年之间的所有日期),您只需将其与person check in/out表联接即可:
此处演示
注:以上假设外出日期是包含在内的(该人在该日期被视为在内)。如果out date是独占的,则
ON
条款变成: