2017-04-12 21 views
2

私はBigQueryで作業しています。私は住所、郵便番号、価格と日付のフィールドを持っているテーブルt1を持っています。私はこれを住所と郵便番号でグループ化し、各住所の最新の行の価格を見つけます。BigQueryで最新の行の属性を取得しますか?

BigQueryでこれを行うにはどうすればよいですか?

SELECT 
    ADDRESS, POSTCODE, MAX(DATE) 
FROM 
    [mytable] 
GROUP BY 
    ADDRESS, 
    POSTCODE 

しかし、私は、これらのフィールドに一致するこれらの行の価格を取得する方法がわからない:私は住所、郵便番号、最新の日付を取得する方法を知っています。これは私の最高の推測ですが、これは結果を生み出します - これは正しいでしょうか?それが動作するはずのよう

SELECT 
    t1.address, t1.postcode, t1.date, t2.price 
FROM [mytable] t2 
JOIN 
(SELECT 
    ADDRESS, POSTCODE, MAX(DATE) AS date 
FROM 
    [mytable] 
GROUP BY 
    ADDRESS, 
    POSTCODE) t1 
ON t1.address=t2.address 
    AND t1.postcode=t2.postcode 
    AND t1.date=t2.date 

これは私には思われるが、similar questionsのいくつかははるかに複雑なソリューションを持っています。

+0

フム以下のようにダミーデータでそれをテストすることができBigQueryの標準SQLについては、以下を試してみてください? – Richard

答えて

3

だけrow_number()を使用します。

SELECT t.* 
FROM (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY ADDRESS, POSTCODE 
           ORDER BY DATE DESC 
           ) as seqnum 
     FROM [mytable] t 
    ) t 
WHERE seqnum = 1; 

これは、集計クエリではありません。最新の値を取得するために行をフィルタリングする必要があります。

+0

ありがとう!興味のないところでは、なぜこれは私の方法よりも好ましいのですか? – Richard

+1

あなたが自己結合をしない限り、メソッドは最大日付に関連付けられた価格を取得することはできませんが、これは結合を必要としません。また、集計関数を使って最新の行を選択する例として、私の答えをhttp://stackoverflow.com/a/43340019/6253347で見ることもできます。 –

1

#standardSQL 
SELECT row.* FROM (
    SELECT ARRAY_AGG(t ORDER BY date DESC LIMIT 1)[OFFSET(0)] AS row 
    FROM `yourTable` AS t 
    GROUP BY address, postcode 
) 

あなたは再生/私は多分それは `INNER JOIN`されるべきだと思う

#standardSQL 
WITH yourTable AS (
    SELECT 'address_1' AS address, 'postcode_1' AS postcode, '2017-01-01' AS date, 1 AS price UNION ALL 
    SELECT 'address_1', 'postcode_1', '2017-01-02', 2 UNION ALL 
    SELECT 'address_1', 'postcode_1', '2017-01-03', 3 UNION ALL 
    SELECT 'address_1', 'postcode_1', '2017-01-04', 4 UNION ALL 
    SELECT 'address_2', 'postcode_2', '2017-01-01', 5 UNION ALL 
    SELECT 'address_3', 'postcode_1', '2017-01-01', 6 UNION ALL 
    SELECT 'address_3', 'postcode_1', '2017-01-02', 7 UNION ALL 
    SELECT 'address_3', 'postcode_1', '2017-01-03', 8 
) 
SELECT row.* FROM (
    SELECT ARRAY_AGG(t ORDER BY date DESC LIMIT 1)[OFFSET(0)] AS row 
    FROM `yourTable` AS t 
    GROUP BY address, postcode 
) 
関連する問題