2017-12-15 10 views
3

私はおそらく正しく検索していませんが、これを見つけることはできません。私は、2列のデータを1列に2倍の列でマージしたい。最初に最新のタイムスタンプを持つものを選択する。次に、2つ以上の行結果がある場合は、最初の2つの行だけを取ります。例データとMSSQL 2行を1つにダブルカラムをマージする

ソース以下の目的の結果:

ID Height Color Type TimeStamp 
1 6  Green Plant 2017-09-23 
1 24  Red  Tree 2017-09-15 
1 33  Pink Shrub 2016-05-14 
2 12  Blue Car  2017-03-21 
2 88  Pink Truck 2017-11-22 

望ましい結果:

ID Height1 Color1 Type1 Height2 Color2 Type2 
1 6  Green Plant 24  Red  Tree 
2 88  Pink Truck 12  Blue Car 

はここ数日間、この上でつまずくされて。助けて!!!

+0

。 'color = 'pink'(ID = 1の場合)はどうなりましたか? – HoneyBadger

+0

最初のIDは3行分ですか?それは 'Height3'などでしょうか? – gofr1

+0

各IDに最後の行が2つだけ必要ですか? – gofr1

答えて

2

OUTERと方法が適用されます。

SELECT TOP 1 WITH TIES y.ID, 
         y.Height as Height1, 
         y.Color as Color1, 
         y.[Type] as [Type1], 
         t.Height2, 
         t.Color2, 
         t.[Type2] 
FROM YourTabel y 
OUTER APPLY (
    SELECT TOP 1 Height as Height2, 
        Color as Color2, 
        [Type] as [Type2] 
    FROM YourTabel 
    WHERE ID = y.ID AND [TimeStamp] < y.[TimeStamp] 
    ORDER BY [TimeStamp] DESC 
) as t 
ORDER BY ROW_NUMBER() OVER (PARTITION BY y.ID ORDER BY y.[TimeStamp] DESC) 

出力:SQL Server 2012のについては

ID Height1 Color1 Type1 Height2 Color2 Type2 
1 6  Green Plant 24  Red  Tree 
2 88  Pink Truck 12  Blue Car 

と上あなたがLAGを使用することができます。

SELECT TOP 1 WITH TIES y.ID, 
         y.Height as Height1, 
         y.Color as Color1, 
         y.[Type] as [Type1], 
         LAG(y.Height) OVER (PARTITION BY y.ID ORDER BY y.[TimeStamp] ASC) Height2, 
         LAG(y.Color) OVER (PARTITION BY y.ID ORDER BY y.[TimeStamp] ASC) Color2, 
         LAG(y.[Type]) OVER (PARTITION BY y.ID ORDER BY y.[TimeStamp] ASC) [Type2] 
FROM YourTabel y 
ORDER BY ROW_NUMBER() OVER (PARTITION BY y.ID ORDER BY y.[TimeStamp] DESC) 
+0

これはうまくいきます。 1つのシナリオを除いて、私は忘れてしまった。たとえば、ID番号3の行が1行しかない場合は、表示されている行からまったく表示されません。 Height2、Color2、Type2にNULLを表示することをお勧めします。思考? –

+1

待ち合わせ!わかった。 CROSS APPLYの代わりにOUTERが適用されます。 –

+0

OUTERについて書いてみました:) – gofr1

0

が想定すると(これを試してみてくださいテーブル名はt1です)

;WITH CTE 
AS 
(
    SELECT 
    RN = ROW_NUMBER() OVER(partition by id ORDER BY TimeStamp desc,ID),  
    * 
    FROM T1 
) 
SELECT 
ID = ROW_NUMBER() OVER(ORDER BY C1.ID), 
C1.HEIGHT AS "HEIGHT1", 
C1.COLOR Color1, 
C1.TYPE Type1, 
C2.HEIGHT Height2, 
C2.COLOR Color2, 
C2.TYPE Type2 
FROM CTE C1 
    LEFT JOIN CTE C2 
    ON C1.RN%2 = 1 
     AND C2.RN%2 = 0 
    WHERE C1.RN = C2.RN-1 
     and c1.rn <3 
     and c1.id = c2.id 

はここDEMO

0

をチェックこれで遊んでみてください:あなたは `pivot`を探している

DECLARE @DataSource TABLE 
(
    [ID] INT 
    ,[Height] INT 
    ,[Color] VARCHAR(12) 
    ,[Type] VARCHAR(12) 
    ,[TimeStamp] DATETIME2 
); 

INSERT INTO @DataSource ([ID], [Height], [Color], [Type], [TimeStamp]) 
VALUES ('1', '6', 'Green', 'Plant', '2017-09-23') 
     ,('1', '24', 'Red', 'Tree', ' 2017-09-15') 
     ,('1', '33', 'Pink', 'Shrub', '2016-05-14') 
     ,('1', '33', 'Pink', 'Shrub 1', '2016-05-13') 
     ,('1', '33', 'Pink', 'Shrub 2', '2016-05-12') 
     ,('1', '33', 'Pink', 'Shrub 3', '2016-05-11') 
     ,('2', '12', 'Blue', 'Car', ' 2017-03-21') 
     ,('2', '88', 'Pink', 'Truck', '2017-11-22') 
     ,('3', '12', 'test', 'test 2', '2017-11-22'); 

SELECT [ID] 
     ,MAX(CASE WHEN [RowID] = 1 THEN [Height] ELSE NULL END) AS [Height1] 
     ,MAX(CASE WHEN [RowID] = 1 THEN [Color] ELSE NULL END) AS [Color1] 
     ,MAX(CASE WHEN [RowID] = 1 THEN [Type] ELSE NULL END) AS [Type1] 
     ,MAX(CASE WHEN [RowID] = 2 THEN [Height] ELSE NULL END) AS [Height2] 
     ,MAX(CASE WHEN [RowID] = 2 THEN [Color] ELSE NULL END) AS [Color2] 
     ,MAX(CASE WHEN [RowID] = 2 THEN [Type] ELSE NULL END) AS [Type2] 
FROM 
(
    SELECT TOP (4) WITH TIES * 
      ,ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [TimeStamp] DESC) AS [RowID] 
    FROM @DataSource 
    ORDER BY [RowID] 
) DS 
GROUP BY [ID]; 

enter image description here

関連する問題