データが更新される度にタイムスタンプを追加したデータをBigQueryに貯めておいて、参照したい時に最新のデータだけを取得したいなー。と思って探したら@satoru_magさんの以下の記事をみつけました。
で、やってみた
データ
データは引用元に合わせてこんな感じ。
shohin_name shohin_code shohin_price update_date
shohin_1 1 1000 2015-10-05 20:15:10 UTC
shohin_2 2 1420 2015-10-05 20:15:10 UTC
shohin_3 3 980 2015-10-05 20:15:10 UTC
renamed_shohin_1 1 1000 2015-10-07 12:30:42 UTC
shohin_2 2 1280 2015-10-07 12:30:42 UTC
- shohin_code:1 のアイテムは名前(shohin_name)をアップデート
- shohin_code:2 のアイテムは価格(shohin_price)をアップデート
- shohin_code:3 は変更なし
クエリ実行
引用元にあるクエリを実行してみた結果が以下。
[
{
"shohin_name": "shohin_2",
"shohin_code": "2",
"shohin_price": "1420",
"f0_": "2015-10-05 20:15:10 UTC"
},
{
"shohin_name": "shohin_3",
"shohin_code": "3",
"shohin_price": "980",
"f0_": "2015-10-05 20:15:10 UTC"
},
{
"shohin_name": "shohin_1",
"shohin_code": "1",
"shohin_price": "1000",
"f0_": "2015-10-05 20:15:10 UTC"
},
{
"shohin_name": "renamed_shohin_1",
"shohin_code": "1",
"shohin_price": "1000",
"f0_": "2015-10-07 12:30:42 UTC"
},
{
"shohin_name": "shohin_2",
"shohin_code": "2",
"shohin_price": "1280",
"f0_": "2015-10-07 12:30:42 UTC"
}
]
最新データだけになってない!!!
アップデートされたshohin_name
、 shohin_price
をGROUP EACH BY
でまとめてしまってるので期待する結果にはなりませんでした。
別のクエリを考えてみた
クエリ
考えた結果以下の様なクエリにしてみました。
SELECT
a.shohin_name AS shohin_name,
a.shohin_code AS shohin_code,
a.shohin_price AS shohin_price,
a.update_date AS update_date
FROM
[hoge.shohin_master] AS a
RIGHT JOIN EACH
(
SELECT shohin_code, MAX(update_date) AS latest
FROM [hoge.shohin_master]
GROUP EACH BY shohin_code
) AS b ON a.shohin_code = b.shohin_code AND a.update_date = b.latest
実行結果
[
{
"shohin_name": "shohin_3",
"shohin_code": "3",
"shohin_price": "980",
"update_date": "2015-10-05 20:15:10 UTC"
},
{
"shohin_name": "renamed_shohin_1",
"shohin_code": "1",
"shohin_price": "1000",
"update_date": "2015-10-07 12:30:42 UTC"
},
{
"shohin_name": "shohin_2",
"shohin_code": "2",
"shohin_price": "1280",
"update_date": "2015-10-07 12:30:42 UTC"
}
]
これを引用元の記事のようにViewに保存しておけば簡単にアクセスできるかなと。
めでたしめでたし。