2017-07-12 3 views
-1

は、私はアテナに次のデータを持っていると言う:アテナ(プレスト)のSQLウィンドウ関数

id  ts 
uid1 1499672134268 
uid1 1499672134292 
uid1 1499672136189 
uid1 1499672136212 
uid1 1499719927907 
uid1 1499719927940 
uid1 1499719927975 
uid1 1499719927999 
uid2 1499670000000 
uid2 1499670000010 
uid2 1499688880010 

私はそれをランク付けします:

rank id  ts 
1  uid1 1499672134268 
1  uid1 1499672134292 
1  uid1 1499672136189 
1  uid1 1499672136212 
2  uid1 1499719927907 
2  uid1 1499719927940 
2  uid1 1499719927975 
2  uid1 1499719927999 
1  uid2 1499670000000 
1  uid2 1499670000010 
2  uid2 1499688880010 

ロジックは次のとおりです。
の違い第2グループの最小値であり、第1グループの最大値は、x

dense_rank() OVER (PARTITION BY id ...)はそれを解決することができますが、私はSQLの窓関数の初心者です。

おかげ

+0

この例では 'x'は何ですか?以前のt> xとの違いがあれば、グループをリセットすることを意味しますか? –

+0

正確には、xは特定のしきい値です。 – belostoky

+0

データサンプルを使用してロジックを明確にします。投稿の定義が@vkpへの返信と一致しません –

答えて

2

あなたはlagを使用して、前の行のtsとの差分を取得し、それが> Xなったときに、実行中の合計を使用して、それをリセットすることができます。

select id,ts,1+sum(col) over(partition by id order by ts) as rnk 
from (select id,ts 
     ,case when ts-lag(ts,1,ts) over(partition by id order by ts) > 3000 then 1 else 0 end as col 
     from tbl 
    ) t 

所望の値にcase式中3000(X)を交換してください。