Sql server 如何获取这些数据?

Sql server 如何获取这些数据?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有这样的想法: Time EQID STATUS USER 12:12am EQ1 0 SA 12:14am EQ1 1 SA 02:30am EQ2 0 SA 03:30am EQ2 1 SA 05:30am EQ1 0 SA 06:30am EQ2 1 SA 现在所需的输出是: In_time

我有这样的想法:

Time       EQID    STATUS  USER    
12:12am     EQ1     0       SA
12:14am     EQ1     1       SA
02:30am     EQ2     0       SA
03:30am     EQ2     1       SA
05:30am     EQ1     0       SA
06:30am     EQ2     1       SA
现在所需的输出是:

In_time   Out_time  EQID  USER
12:12am    12:14am   EQ1   SA
02:30am    03:30am   EQ2   SA
05:30am    06:30am   EQ1   SA
此处
In_time
是状态为“0”的时间,
Out_time
是状态为“1”的时间。如何为特定设备和用户获取此
输入时间
输出时间


注意:像这样,我有这么多的行和多个用户,我如何才能得到它?

一种方法是对Status=0的所有行进行主查询。这将为您提供所有列,除了
out\u time

此外,还有一个相关子查询,用于获取
out\u time
并获取第一行(按
time
排序),其中EQID和User与主查询相同,状态为1,并且
time
大于主查询中的
time


(换句话说,
out\u Time
是状态为1且大于当前状态为0行的设备和用户的最小
Time

一种方法是对状态为0的所有行进行主查询。这将为您提供所有列,除了
out\u time

此外,还有一个相关子查询,用于获取
out\u time
并获取第一行(按
time
排序),其中EQID和User与主查询相同,状态为1,并且
time
大于主查询中的
time


(换句话说,
out\u Time
是状态为1且大于当前状态为0行的设备和用户的最小
时间

  • 您正在将
    TIME
    存储为
    VARCHAR
  • 您存储的时间中没有日期
  • ,因此无法确定用户在某一天打卡但在下一天没有打卡
  • 您没有提到EQID是什么,也没有提到为什么在最后一行选择EQ1而不是EQ2
  • 话虽如此。。。这里有一个方法

    declare @table table (  [Time] varchar(64), 
                            EQID char(3), 
                            [STATUS] int, 
                            [USER] char(2))
    
    insert into @table
    values
    ('12:12am','EQ1',0,'SA'),
    ('12:14am','EQ1',1,'SA'),
    ('02:30am','EQ2',0,'SA'),
    ('03:30am','EQ2',1,'SA'),
    ('05:30am','EQ1',0,'SA'),
    ('06:30am','EQ2',1,'SA')
    
    ;with cte as(
    select
        [Time]
        ,EQID
        ,[USER]
        ,[Status]
        ,RN = row_number() over(partition by [USER] order by cast(stuff([Time],6,0,' ') as time))
    from 
        @table t)
    
    select
        In_Time = i.[Time]
        ,Out_Time = o.[Time]
        ,i.EQID
        ,i.[USER]
    from
        cte i
        left join cte o on
        o.[USER] = i.[USER]
        and o.RN = i.RN + 1
    where
        i.[STATUS] = 0
    

    你这里有一些问题

  • 您正在将
    TIME
    存储为
    VARCHAR
  • 您存储的时间中没有日期,因此无法确定用户在某一天打卡但在下一天没有打卡
  • 您没有提到EQID是什么,也没有提到为什么在最后一行选择EQ1而不是EQ2
  • 话虽如此。。。这里有一个方法

    declare @table table (  [Time] varchar(64), 
                            EQID char(3), 
                            [STATUS] int, 
                            [USER] char(2))
    
    insert into @table
    values
    ('12:12am','EQ1',0,'SA'),
    ('12:14am','EQ1',1,'SA'),
    ('02:30am','EQ2',0,'SA'),
    ('03:30am','EQ2',1,'SA'),
    ('05:30am','EQ1',0,'SA'),
    ('06:30am','EQ2',1,'SA')
    
    ;with cte as(
    select
        [Time]
        ,EQID
        ,[USER]
        ,[Status]
        ,RN = row_number() over(partition by [USER] order by cast(stuff([Time],6,0,' ') as time))
    from 
        @table t)
    
    select
        In_Time = i.[Time]
        ,Out_Time = o.[Time]
        ,i.EQID
        ,i.[USER]
    from
        cte i
        left join cte o on
        o.[USER] = i.[USER]
        and o.RN = i.RN + 1
    where
        i.[STATUS] = 0
    


    请只将句子的第一个单词、人名和I大写。不要随意将其他单词大写,这会使阅读变得更困难。@MarkRotteveel好的……示例数据中的最后一个记录不应该是
    EQ1
    ?@MichałTurczyn是的,它是EQ1。我必须像问题中提到的那样捕获n次,哪个数据类型是列“时间“?请仅将句子的第一个单词、人名和I大写。不要随意将其他单词大写,它使事情更难阅读。@Markrottveel好的……示例数据中的最后一条记录不应该是
    EQ1
    ?@MichałTurczyn是的,它是EQ1。我必须像问题中提到的那样捕获n次,哪种数据类型是“时间”列?不明白你能写一个示例查询@TabAllemanI编辑了答案以清楚。我不会为您编写查询,但如果您尝试,我将帮助您调试它。正在获取子查询返回多个值。。请帮助这一点让我抓狂从早上起就一直在这样做请帮助您的子查询可能只需要选择列表中的前1个,但是您需要发布查询以便我调试它。@saibharath当您查找大于您正在查看的行的
    Time
    时,您的条件可能匹配多行。在我的示例答案中,我使用了一个
    TOP 1
    子查询,只返回1个结果,而不是在您查看的输入时间之后的所有匹配时间。没有得到您可以请您在@TabAllemanI编写一个示例查询。为了清楚起见,我编辑了答案。我不会为您编写查询,但如果您尝试,我将帮助您调试它。正在获取子查询返回多个值。。请帮助这一点让我抓狂从早上起就一直在这样做请帮助您的子查询可能只需要选择列表中的前1个,但是您需要发布查询以便我调试它。@saibharath当您查找大于您正在查看的行的
    Time
    时,您的条件可能匹配多行。在我的示例回答中,我使用了一个
    TOP 1
    子查询,只返回1个结果,而不是在查看的输入时间之后的所有匹配时间。您的连接条件查询没有充分关联。它不考虑EQID或用户。@ TabLaMeNe他的示例不考虑这些字段,否则“EQ1”的外出时间不会是6:30AM。该值属于
    EQ2
    。我想可以假设用户需要是相同的,但是…实际上在注释中,OP指出最后一个示例行应该是EQ1。不过,到目前为止,该问题尚未对其进行编辑。但在所需输出之后的段落中,OP指出EQID和User必须同时考虑。同意,这应该有效,这是我在回答中建议的一种书写方式。@TabAlleman哦!我不是故意踩你的脚。我只是试着写答案来练习我自己的能力,但OP没有清楚地理解你想要教什么(不是你自己的错)。抱歉破坏了学习体验!您的连接条件查询没有充分关联。它不考虑EQID或用户。@ TabLaMeNe他的示例不考虑这些字段,否则“EQ1”的外出时间不会是6:30AM。该值属于
    EQ2
    。我想可以假设用户需要是相同的,但是…实际上在注释中,OP指出最后一个示例行应该是EQ1。不过,到目前为止,该问题尚未对其进行编辑。但是在后面的段落中是的