计算不同日期间隔的日期之间的事件

bt1cpqcv  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(403)

我有一个查询,它给了我这样一个表:

Person | Date_IN | Date_OUT | Structure

一年中一个人进出很多次,进出也可以是同一天。
我想计算一下,一年中某一天,每个建筑里有多少人。
最终目标是在给定的时间段(3月1日--3月31日)内,每个结构每天的总人数。

vx6bjr1n

vx6bjr1n1#

你说不能有多个 date_in 为了同一天和同一个人,因为一个人至少在一天之内。因此,对于给定的日期,我们只需查看每个人在此之前的最新事件,就可以确定此人是否在该日期。
步骤如下:
为所需的实时天数创建数据集
和table一起吃最后一个 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;
brtdzjyr

brtdzjyr2#

请使用下面的查询,数据按特定时间段的结构分组。

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
kknvjkwl

kknvjkwl3#

我相信下面的方法会奏效。它假设您有一个日期表(由一列组成,其中包含1950年到2050年之间的所有日期),您只需将其与person check in/out表联接即可:

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

相关问题