如何获得这些数据?

时间:2017-12-27 18:51:42

标签: 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   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”的时间。如何为该特定EQID和用户获取此In_timeOut_time

注意:像这样我有很多行有多个用户,我怎么能得到这个呢?

3 个答案:

答案 0 :(得分:1)

一种方法是对Status = 0的所有行进行主查询。这将为您提供除out_time之外的所有列。

添加到此,获取out_time的相关子查询并获取第一行(按Time排序),其中EQID和用户与主查询相同,状态= 1,以及Time大于主查询中的Time

(换句话说,out_Time是此EQID& User的MIN Time,其Status = 1,大于当前Status = 0行。)

答案 1 :(得分:1)

sudo chown -R www-data /var/www
sudo chmod -R u=rwx /var/www

答案 2 :(得分:0)

这里有一些问题。

  1. 您正在将TIME存储为VARCHAR
  2. 您正在存储 TIME 而没有DATE,因此无法确定用户何时在某一天上班但未在下一次计时
  3. 你没有提到EQID是什么或为什么你选择EQ1而不是最后一行的EQ2
  4. 说到这里......这是一种方式。

    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