Sql 我有一个人的多次出入境状态。如何获取单身人士的最后状态
我有一个sql表格,格式如下Sql 我有一个人的多次出入境状态。如何获取单身人士的最后状态,sql,sql-server,entity-framework,sql-server-2008,Sql,Sql Server,Entity Framework,Sql Server 2008,我有一个sql表格,格式如下 Userid Status Logtime 1 In 10:10 1 In 10:12 2 In 10:14 3 In 10:16 3 Out 10:18 1 Out 10:20 4 In 10:22 2 Out 10:24 所需输出 Userid Status In_time Out_t
Userid Status Logtime
1 In 10:10
1 In 10:12
2 In 10:14
3 In 10:16
3 Out 10:18
1 Out 10:20
4 In 10:22
2 Out 10:24
所需输出
Userid Status In_time Out_time
1 out 10:20
2 In 10:14 10:24
3 In 10:16 10:18
4 In 10:22
你可以试试这个
Create table TblInOut(Userid int, sStatus Varchar(10), Logtime Varchar(10))
insert into TblInOut Values(1, 'In', '10:10'), (1, 'In', '10:12'), (2, 'In', '10:14'), (3, 'In', '10:16'), (3, 'Out', '10:18'),
(1, 'Out', '10:20'), (4, 'In', '10:22'), (2, 'Out', '10:24')
select Userid,
max(case when sStatus = 'In' then Logtime end) as INTIME,
max(case when sStatus = 'Out' then Logtime end) as OUTIME
from (select t.*,
row_number () over (order by Cast(Logtime as Time)) as seq1,
row_number () over (partition by Userid order by Cast(Logtime as Time)) as seq2
from TblInOut t
) t
group by Userid;
它将给出如下输出。这是你的电话号码
编辑
Userid IN_TIME OUT_TIME
1 10:12 10:20
2 10:14 10:24
3 10:16 10:18
4 10:22 NULL
要在特定时间段签入,可以使用以下查询。如果只想检查out的用户和总计数,则将having子句状态更改为out
select Userid,
max(case when sStatus = 'In' then Logtime end) as INTIME,
max(case when sStatus = 'Out' then Logtime end) as OUTIME,
Count(*) as TotalInOut
from TblInOut t
group by Userid having max(case when sStatus = 'In' then Logtime end) between Cast('10:10' as Time) and Cast('10:18' as Time);
如果您希望一个人在特定时间段内完成了in
和out
,则可以使用having子句,如下所示
having max(case when sStatus = 'In' then Logtime end) between Cast('10:10' as Time) and Cast('10:18' as Time)
and max(case when sStatus = 'Out' then Logtime end) between Cast('10:10' as Time) and Cast('10:18' as Time);
您还可以使用或
运算符在上述having子句中的特定时间段签入或签出
您可以按建议将Min()用于输入,将Max()用于输出。
要将查询与其他表连接,可以按照以下步骤操作
In_Time
应该是第一个状态,而不是最后一个状态
那么你的结果应该是
用户ID输入\超时\时间
1 10:10 10:20
2 10:14 10:24
3 10:16 10:18
4 10:22 NULL
代码如下,现场演示
已更新
如果您想在_Time中获取的最后状态,只需将条件从Min
稍微调整到Max
,如下所示,实时演示
输出
Userid IN_TIME OUT_TIME
1 10:12 10:20
2 10:14 10:24
3 10:16 10:18
4 10:22 NULL
Logtime
字段的数据类型是什么?需要将预期输出检查为用户id 1不输入,用户id 2不输出。为什么?还有为什么实体框架标记被标记?您尝试了什么?你有代码启动吗?因此,这是为了帮助您找到答案,而不是为您的工作。为什么用户ID 1在您的要求中没有in_time。时间应该是第一个状态,而不是最后一个状态。谢谢您的帮助。我是否可以进一步计算一下,在当前时间内有多少人是首次入住和外出的。你觉得怎么样@苏拉杰·库马尔。反正+1@KamalpreetSingh发布您的查询我将尝试修改和帮助,或者您也可以发布单独的问题。@kamalpreetish您可以选中此项-@kamalpreetish在外部查询中您可以像这样尝试-Select Employee.EmployeeId,Employee.Name,a.*from(………这是否回答了您的问题?如果您需要任何帮助,请告诉我@Kamalpreet SinghIt取决于需求,并且可以相应地修改查询。是的,只需使用Min
Max
即可解决问题:)谢谢,这也符合要求。我怎样才能计算出目前入住和外出的人数。给你
SELECT Userid,
MAX(CASE WHEN sStatus = 'IN' THEN Logtime ELSE NULL END) AS IN_TIME,
MAX(CASE WHEN sStatus = 'Out' THEN Logtime ELSE NULL END) OUT_TIME
FROM TblInOut
GROUP BY Userid
Userid IN_TIME OUT_TIME
1 10:12 10:20
2 10:14 10:24
3 10:16 10:18
4 10:22 NULL