2016-11-14 25 views
1

テーブルから最初と最後の行を取得するために、次のクエリを実行しました。テーブルの最初と最後の行を取得するクエリ

SELECT Start, End, Start1, End1 
FROM 
(SELECT Start AS Start, End AS End 
    FROM [TB1] WHERE Id = 251 ORDER BY DateTime DESC LIMIT 1), 
(SELECT Start1 AS Start1, End1 AS End1 
    FROM [TB2] WHERE Id = 251 ORDER BY DateTime LIMIT 1); 

次のように私は出力を得る:私は以下のフォーマットで出力取得しようとしています

Start  End  Start1  End1 
25.32  -98.55 null  null 
null  null  29.81  -98.32 

:使用max

Start  End  Start1  End1 
25.32  -98.55 29.81  -98.32 

答えて

1

私はあなたの質問が「部分的」であると感じ、次はすべてのIDのために同じことをする方法になります! (表示オプション」の下に「使用レガシーSQL」をオフにします(というよりも2)単一のテーブルの上に、最初と最後の行をしたい場合、あなたはstandard SQLORDER BYLIMITARRAY_AGGを使用して、それを計算することができますに

SELECT Id, Start, End, Start1, End1 
FROM 
(SELECT Id, Start, End 
FROM (
    SELECT 
    Id, Start AS Start, End AS END, 
    ROW_NUMBER() OVER(PARTITION BY Id ORDER BY DateTime DESC) AS win 
    FROM [TB1]) 
WHERE win = 1 
) AS t1 
JOIN 
(SELECT Id, Start1, End1 
FROM (
    SELECT 
    Id, Start1 AS Start1, End1 AS End1, 
    ROW_NUMBER() OVER(PARTITION BY Id ORDER BY DateTime) AS win 
    FROM [TB2]) 
WHERE win = 1 
) AS t2 
ON t1.Id = t2.Id 
1

をので、結果が1行になります。

SELECT max(Start) start, max(End) end, max(Start1) start1, max(End1) end1 
FROM 
(SELECT Start AS Start, End AS End 
    FROM [TB1] WHERE Id = 251 ORDER BY DateTime DESC LIMIT 1), 
(SELECT Start1 AS Start1, End1 AS End1 
    FROM [TB2] WHERE Id = 251 ORDER BY DateTime LIMIT 1); 
1

の下を参照してください。 ")。

WITH T AS (
    SELECT 251 AS Id, 10.0 AS Start, -15 AS `End`, DATE('2016-11-09') AS DateTime UNION ALL 
    SELECT 251, 25.32 AS Start, -98.55, DATE('2016-11-10') UNION ALL 
    SELECT 251, 29.81, -98.32, DATE('2016-01-01') 
) 
SELECT 
    ARRAY_AGG(STRUCT(Start, `End`) 
      ORDER BY DateTime DESC LIMIT 1)[OFFSET(0)] AS first_row, 
    ARRAY_AGG(STRUCT(Start AS Start1, `End` AS End1) 
      ORDER BY DateTime ASC LIMIT 1)[OFFSET(0)] AS last_row 
FROM T 
WHERE Id = 251; 

一般に、これは解析機能を使用するよりも少し速いでしょうが、私は特定の比較を行っていません。

関連する問題