はだだだだ

定食にサラダは不要だと思う。

MENU

Prestoでweek関数とyear関数を組み合わせてグルーピングを行う時の注意点

週次で集計を行いたいときに、以下のようにweek関数とyear関数でグルーピングをしようとしました。

with temp as (
  select
    week(from_unixtime(unixtime)) as week
    , year(from_unixtime(unixtime)) as year
    , id
  from
    table
)

select 
  week
  , year
  , count(id)
from
  temp
group by
  week
  , year 
sort by
   week
   , year

これで週次の集計ができると思っていたのですが、week関数は1/1以降の最初の月曜日からカウントし始めるのに対して、year関数は1/1になると曜日関係なしに年が変わります。

そのため、1/1以降の日でweek関数だとまだ52や53とカウントされていてもyear関数の年が新しい年になっている場合があります。

その影響で、year関数とweek関数を組み合わせてグルーピングしたときに、例えばyyyy/1/1とyyyy/12/31が同じグループに入ってしまう場合があります。

これを避けるためには以下のようにする必要があります。

with temp as (
  select
    week(from_unixtime(unixtime)) as week
    , date_format(from_unixtime(unixtime), '%v') as year
    , id
  from
    table
)

select 
  week
  , year
  , count(id)
from
  temp
group by
  week
  , year 
sort by
   week
   , year

この書き方をすることでyyyy/1/1とyyyy/12/31が同じグループに入る可能性がなくなります。

date_format(timestamp, '%v')という記法はMySQLと同じようです。

6.13. Date and Time Functions and Operators — Presto 0.220 Documentation

weekとyearという関数なので、整合性がとれていると思っていたのですが、そのまま組み合わせて使ってしまうと間違ったグルーピングを行ってしまうことがわかりました。

以上