2017-12-27 933 views
0

我有這樣的事情:如何獲取此數據?

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

注:喜歡我有多個用戶,讓很多行,我怎樣才能得到呢?

+0

請只大寫一個句子的第一個單詞,人名和I.不要隨機地大寫其他單詞,這會讓閱讀變得更難。 –

+0

@MarkRotteveel好了... –

+0

不應該在例如數據最後一個記錄是'EQ1'? –

回答

1
CREATE TABLE #data (
    [Time] datetime, 
    [EQID] nvarchar(10), 
    [Status] bit, 
    [User] nvarchar(10) 
) 

INSERT INTO #data VALUES ('2017-12-27 12:12am', 'EQ1', 0, 'SA') 
INSERT INTO #data VALUES ('2017-12-27 12:14am', 'EQ1', 1, 'SA') 
INSERT INTO #data VALUES ('2017-12-27 02:30am', 'EQ1', 0, 'SA') 
INSERT INTO #data VALUES ('2017-12-27 03:30am', 'EQ1', 1, 'SA') 
INSERT INTO #data VALUES ('2017-12-27 05:30am', 'EQ1', 0, 'SA') 
INSERT INTO #data VALUES ('2017-12-27 06:30am', 'EQ1', 1, 'SA') 

-- Get the next time where status is 1 
SELECT D1.[Time] as 'In_Time' 
    , D2.[Time] as 'Out_Time' 
    , D1.[EQID] 
    , D1.[User] 
FROM #data D1 
    LEFT JOIN #data D2 
     ON D2.[Time] = (SELECT TOP 1 [Time] 
         FROM #data 
         WHERE [Status] = 1 
         AND [Time] > D1.[Time] 
         AND [User] = D1.[User] 
         AND [EQID] = D1.[EQID] 
         ORDER BY [Time]) 
WHERE D1.[Status] = 0 
+1

您的連接條件查詢沒有充分關聯。它不考慮EQID或用戶。 –

+0

@TabAlleman他的榜樣不考慮這些領域,或者'EQ1'的出場時間不是上午6:30。該值屬於'EQ2'。我想可以假設用戶需要是相同的,雖然... – EMUEVIL

+0

實際上在評論中,OP指出最後一個示例行實際上應該是EQ1。儘管如此,它還沒有在問題中編輯過。但是,在正確的輸出結束後的段落中,OP表示必須同時考慮EQID和用戶。 –

1

一種方法是做所有的行,其中狀態= 0的主查詢。這會給你所有的列,除了out_time

添加到這一點,一個相關子查詢以獲得out_time並獲得第一行(爲了通過Time),其中EQID和用戶是相同的主查詢,狀態= 1,並且TimeTime更大在主查詢中。

(換句話說,該out_Time是MIN Time此EQID &用戶與狀態= 1比當前狀態= 0行更大。)

+0

狀態,用戶ID,eqid沒讓你可以請你寫一個簡單的查詢@TabAlleman –

+0

我已經編輯了清晰的答案。我不會爲你寫查詢,但如果你嘗試了,我會幫你調試它。 –

+0

對不起。我沒有得到這個.. –

0

這裏有幾個問題。

  1. 你存儲TIMEVARCHAR
  2. 您存儲TIME沒有DATE這使得它無法確定當用戶在主頻的第一天,但​​沒有時鐘輸出的下一個
  3. 您還沒有提到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