sqlite将每次进入和退出计算为一次进入
假设我们有一个类,对于这个类,每个学生都可以多次进入和退出,我将它们存储在数据库中(每次进入和每次进入后退出),例如:sqlite将每次进入和退出计算为一次进入,sql,sqlite,counting,Sql,Sqlite,Counting,假设我们有一个类,对于这个类,每个学生都可以多次进入和退出,我将它们存储在数据库中(每次进入和每次进入后退出),例如: `id`, `student_id`, `session_id`, `enter`, `exit`, `date_time` '1', '123', '1', '1', '0', '---', #enter '1', '123', '1', '1', '1
`id`, `student_id`, `session_id`, `enter`, `exit`, `date_time`
'1', '123', '1', '1', '0', '---', #enter
'1', '123', '1', '1', '1', '---', #exit
有123
id的学生进入了班级,而1
进入了班级,我创建了一行,通过enter=1和exit=0
退出课堂后,我有另一个新行作为enter=1和exit=1
我应该有这个结构,我不能在一行中更改它们,这意味着我不能更新现有行。现在,该学生可以多次进入课堂,并在存储输入数据后退出
事实上,这个学生只是一个进入课堂并从指定课堂退出的人,session\u id=1
,现在我如何计算这个操作并从数据库中获取?我不需要计算学生在课堂上的出席人数,我只需要计算所有多次进入课堂的学生人数作为一个记录
示例sql我认为您可以使用条件聚合实现您想要的,将
enter=1
和exit=0
作为登录,将enter=1
和exit=1
作为注销。您还可以通过将查询写入连接来简化查询:
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
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1
如果您只需要每个课程的学生人数(登录或注销),您可以计算该课程的不同条形码:
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 logins logouts person
1 class_a 1 --- 4 2 2
2 class_b 2 --- 2 0 2
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1
我认为使用条件聚合可以实现您想要的,将enter=1
和exit=0
作为登录,将enter=1
和exit=1
作为注销。您还可以通过将查询写入连接来简化查询:
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
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1
如果您只需要每个课程的学生人数(登录或注销),您可以计算该课程的不同条形码:
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 logins logouts person
1 class_a 1 --- 4 2 2
2 class_b 2 --- 2 0 2
id session_name session_type date_time person
1 class_a 1 --- 3
2 class_b 2 --- 1
在单行中同时标记enter和exit的逻辑是什么?@TimBiegeleisen我不知道,服务器端开发人员希望我将它们与此结构一起使用您使用的数据库是什么?标题是sqlite,但您同时标记了sqlite和mysql。只标记您实际使用的一行。@Shawn这是SQLITE用enter和exit标记一行背后的逻辑是什么?@TimBiegeleisen我不知道,服务器端开发人员希望我将它们与此结构一起使用您使用的数据库是什么?标题是sqlite,但您同时标记了sqlite和mysql。只标记您实际使用的一个。@Shawn这是Sqlite我认为这个查询不正确,因为forsection\u id=1
我只有三个学生在上课,但我得到了2
,正确的是3
,对于section\u id=2
我得到了0
,你们不需要计算每一个进入或离开课堂的人数,我只需要让分组的学生将多个进入或离开课堂的人数计算为一个学生,我一定是误解了你们的问题。也许这就是你想要的@DolDurma那是你想要的评论吗?如果是的话,我会更新答案,以便其他看到这个问题的人都能看到。是的,非常感谢。我从你的评论和我的问题解决方案中得到了新的更新。我有点问题,你能帮我解决吗?在这个链接中,当我有更多的id
和相同的数据时,我得到了错误的结果,在这个查询中,我必须有1-1
,但是我得到2-0
我认为这个查询是不正确的,因为for部分的id=1
我只有三个学生在课堂上,但我得到了2
,正确的是3
,对于section\u id=2
i,正确的学生人数是1
,我得到0
,你不需要计算每次进入或离开课堂的人数,我只需要让分组的学生将多人作为一个学生进入或离开课堂,我一定是误解了你的问题。也许这就是你想要的@DolDurma那是你想要的评论吗?如果是的话,我会更新答案,以便其他看到这个问题的人都能看到。是的,非常感谢。我从你的评论和我的问题解决方案中得到了新的更新。我有点问题,你能帮我解决吗?在这个链接中,当我有更多的id
和相同的数据时,我得到了错误的结果,在这个查询中我必须有1-1
,但我得到2-0