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

我有一个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_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