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 = 1exit = 0 作为登录的情况,以及 enter = 1exit = 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

Demo on dbfiddle

如果您只想知道每个会话的学生人数(登录或注销),您可以计算该会话的不同条形码:

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

Demo on dbfiddle