Runner in the High

技術のことをかくこころみ

mercari/datastoreがDistinctOnメソッドをサポートした

先日PRを出していたものがマージされた。

github.com

GCP DatastoreのDistinctOnは履歴系テーブルを触るときに便利で、例えばチームごとのログイン履歴を保持するLoginHistoryというカインドに対して「全チームの最新のログイン履歴を取得する」というクエリがGQLで言うと以下のように一発で書ける。

select distinct on (teamId) createdAt, teamId 
  from LoginHistory 
  order by teamId asc, createdAt desc

Distinctだけじゃできないのん、と思われるがドキュメントによるとonする対象とprojectionしたいカラムが異なる場合にはやはりDistinctOnが使えないと上記のクエリと同じ結果は出せない。

SELECT DISTINCT a, b, c is identical to SELECT DISTINCT ON (a, b, c) a, b, c

もちろん、DistinctOnがなくてもアプリケーションサイドでgroup-byするような実装を書けばいいが、クエリで出せるならクエリで出したい気持ちがある。

イベント・ソーシングするようなデータ構造を持っている場合には便利に使えると思われる。