sqlite 将每次进入和退出计算为一次进入
sqlite calculate each enter and exit to as one enter
你假设我们有一个 class,为此 class 每个学生都可以多次进入和退出,我已经将它们存储在数据库中(每次进入和每次进入 class), 例如:
`id`, `student_id`, `session_id`, `enter`, `exit`, `date_time`
'1', '123', '1', '1', '0', '---', #enter
'1', '123', '1', '1', '1', '---', #exit
有 123
id 的学生进入了 class,1
进入了 class,我通过 enter = 1 and exit = 0
[= 创建了行17=]
从 class 退出后,我有另一个新行 enter = 1 and exit = 1
我应该有这个结构,我不能在单行中改变它们,这意味着我不能更新现有的行。现在,这个学生可以多次进入 class 并在存储输入数据后退出,
实际上这个学生只有一个人进入了class并退出了指定的class,session_id = 1
,现在我如何计算这个操作并从数据库中获取?我不需要计算 class 中的学生人数,我只需要将多次进入 class 的所有学生计数为 1 条记录
DB-FILLDLE 样本 sql
我认为你可以使用条件聚合来实现你想要的,总结 enter = 1
和 exit = 0
作为登录的情况,以及 enter = 1
和 exit = 1
的情况作为注销。您还可以通过将查询写成 JOIN
:
来简化查询
select s.id, s.session_name, s.session_type, s.date_time,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) as logins,
sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as logouts,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) - sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id
输出:
id session_name session_type date_time logins logouts person
1 class_a 1 --- 4 2 2
2 class_b 2 --- 2 0 2
如果您只想知道每个会话的学生人数(登录或注销),您可以计算该会话的不同条形码:
select s.id, s.session_name, s.session_type, s.date_time,
count(distinct b.barcode) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id
输出:
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1
你假设我们有一个 class,为此 class 每个学生都可以多次进入和退出,我已经将它们存储在数据库中(每次进入和每次进入 class), 例如:
`id`, `student_id`, `session_id`, `enter`, `exit`, `date_time`
'1', '123', '1', '1', '0', '---', #enter
'1', '123', '1', '1', '1', '---', #exit
有 123
id 的学生进入了 class,1
进入了 class,我通过 enter = 1 and exit = 0
[= 创建了行17=]
从 class 退出后,我有另一个新行 enter = 1 and exit = 1
我应该有这个结构,我不能在单行中改变它们,这意味着我不能更新现有的行。现在,这个学生可以多次进入 class 并在存储输入数据后退出,
实际上这个学生只有一个人进入了class并退出了指定的class,session_id = 1
,现在我如何计算这个操作并从数据库中获取?我不需要计算 class 中的学生人数,我只需要将多次进入 class 的所有学生计数为 1 条记录
DB-FILLDLE 样本 sql
我认为你可以使用条件聚合来实现你想要的,总结 enter = 1
和 exit = 0
作为登录的情况,以及 enter = 1
和 exit = 1
的情况作为注销。您还可以通过将查询写成 JOIN
:
select s.id, s.session_name, s.session_type, s.date_time,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) as logins,
sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as logouts,
sum(case when b.enter = '1' and b.exit = '0' then 1 else 0 end) - sum(case when b.enter = '1' and b.exit = '1' then 1 else 0 end) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id
输出:
id session_name session_type date_time logins logouts person
1 class_a 1 --- 4 2 2
2 class_b 2 --- 2 0 2
如果您只想知道每个会话的学生人数(登录或注销),您可以计算该会话的不同条形码:
select s.id, s.session_name, s.session_type, s.date_time,
count(distinct b.barcode) as person
from sessions s
left join barcodes b on b.session_id = s.id
group by s.id
输出:
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1