Rank付け
RANK関数で順序をつけるときの順序の付け方って何がベストなのか、について気になったので。
RANK付けには2種類が有ると思います。
- 同一の値の場合には、同じ番号を付与する
- 同一の値の場合には、別の番号を付与する
1の例(user_idとアクセス時間でRank):
number | user_id | date |
---|---|---|
1 | userA | 2014-01-01 |
2 | userA | 2014-01-02 |
2 | userA | 2014-01-02 |
4 | userB | 2014-01-01 |
2の例(user_idとアクセス時間でRank):
number | user_id | date |
---|---|---|
1 | userA | 2014-01-01 |
2 | userA | 2014-01-02 |
3 | userA | 2014-01-02 |
4 | userB | 2014-01-01 |
なぜ気になったのか
TreasureDataには、TD_X_RANKという独自UDFのRANK関数がでは、2を採用しているが、
PrestoのRANK関数では1を採用しており、一般的にどちらが好まれるのかな?と疑問に思ったため。
TreasureDataのTD_X_RANKを試してみる
SELECT
TD_X_RANK(USER) AS rank,
USER,
TD_TIME_FORMAT(time,
'yyyy-MM-dd HH:mm:ss',
'JST') AS time
FROM (
SELECT
USER,
time
FROM
www_access
CLUSTER BY USER, time
) t
PrestoのRANKを試してみる
SELECT
RANK(
) OVER(
PARTITION BY USER
ORDER BY
time
) AS rnk,
USER,
TD_TIME_FORMAT(time,
'yyyy-MM-dd HH:mm:ss',
'JST') AS time
FROM
www_access
ORDER BY
USER,
rnk
おわりに
書いてておもったのですが、TD_X_RANKは、Prestoのrow_number関数と同じだと思えばよかったのですね。
なるほどなるほど。
PrestoのROW_NUMBERを試してみる
SELECT
ROW_NUMBER(
) OVER(
PARTITION BY USER
ORDER BY
time
) AS rnk,
USER,
TD_TIME_FORMAT(time,
'yyyy-MM-dd HH:mm:ss',
'JST') AS time
FROM
www_access
ORDER BY
USER,
rnk
おわりにpart.2
Hiveでrow_numberがなかったっけ?とおもったら、0.11以上からでした。
なるほどなるほど。