【小ネタ】SQLで複数カラムに対してDISTINCT【Athena/Presto編】

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SQL で特定のカラムに対して重複を排除した数を数えたい時

SELECT COUNT(DISTINCT column)

とすればOKです。

では、対象のカラムが複数あるときはどうすればよいでしょうか?

対象のカラムが文字列型の場合、複数カラムを文字列連結させて、擬似的に1カラムとみなすことが考えられます。

SELECT COUNT(DISTINCT column1 || ',' || column2)

この場合、対象のカラムが全て文字列型であるという大前提があるうえ、仮に全て文字列型の場合も、結合によって意図せず一致してしまうこともありえます。

分散 SQL クエリーエンジン Presto では、structural データ型の ROW 型を使うとシンプルにかけます。

SELECT COUNT(DISTINCT ROW(column1, column2))

Presto の structural 型について

Presto には今回紹介した ROW 型を含む3種類の structural 型が存在します。

  • ARRAY : ある型の配列ARRAY[1, 2, 3] => [1, 2, 3]
  • MAP : MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]) => {bar=2, foo=1}
  • ROW : SQL 型を並べたもの CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE)) => {x=1, y=2.0}

ROW 型の性質から、DISTINCT した各カラムの型を意識する必要はありません。

ROW 型は Presto 0.148 以降でお試しください。

参考