2017-03-05 4 views
2

私は時間レコードとタイプ1と2のテーブルを1つ持っています。それらを1つの行に結合します。 2つの日付行を1列の2列に結合する

私はlog_type 1とlog_type 2のパートナーがないと予想しています。期待される結果は次のようになります。ここでは

A | 2017-02-01 08:00:00.000 | 2017-02-01 08:10:00.000 
A | 2017-02-01 08:30:00.000 | 
A | 2017-02-01 08:40:00.000 | 2017-02-01 08:50:00.000 
A | 2017-02-01 09:00:00.000 | 

は私のスクリプトです:

create table test_time 
(
    person varchar(30) 
    ,log_time datetime 
    ,log_type int 
) 

insert into test_time 
values 
('A','2017-02-01 8:00:00',1) 
,('A','2017-02-01 8:10:00',2) 
,('A','2017-02-01 8:30:00',1) 
,('A','2017-02-01 8:40:00',1) 
,('A','2017-02-01 8:50:00',2) 
,('A','2017-02-01 9:00:00',1) 

また、私は他の人を扱うことができるはずです。私はすでにROW_NUMBERを試しましたが、私は立ち往生しています。前もって感謝します。

答えて

3

Iは、(未テスト)次のクエリをしようと:サブクエリと

SELECT y.* 
FROM (
    SELECT t.person, t.log_time, t.log_type, 
     ROW_NUMBER() OVER(PARTITION BY t.person ORDER BY t.log_time) - t.log_type AS group_num 
    FROM dbo.MyTable AS t 
) x 
PIVOT(MAX(x.log_time) FOR x.log_type IN ([1], [2])) y 
ORDER BY y.person, y.group_num 
1

私はの結果をカラムに入れません。私はちょうど適切な値を持つ2番目の列を定義します。

あなたはlead()をしたいように見える:

select t.*, 
     (case when next_log_status = 2 then next_log_time end) as log_time_2 
from (select t.*, 
      lead(log_time) over (partition by person order by log_time) as next_log_time, 
      lead(log_status) over (partition by person order by log_time) as next_log_status 
     from test_time t 
    ) t 
where log_status = 1; 

あなたが本当に1列に2つの日付をしたい場合は、あなたがそれらを一緒に連結することができます。それは私には役に立たないようです。

0

select 
    t1.person, 
    t1.log_time, 
    (
     select top 1 test_time 
     from test_time t2 
     where t1.person = t2.person 
      and t2.log_type = 2 
      and t1.test_time <= t2.test_time 
     order by test_time asc) log_time2 
from test_time t1 
where t1.log_type = 1 
+0

行番号2、列2がNULLでなければなりません。 3行目の値がクエリに使用されました – Tonned

関連する問題