2017-07-12 26 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 

的逻辑是:
之间的差异在第二组中的最大值和第一组中的最大值大于x

我在想一些的组合可以解决它,但我是SQL的窗口函数的总新手。

感谢

+0

在这个例子中'x'是什么?如果与前面的ts> 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)。