2017-07-12 4 views
-1

sagen, dass ich die folgenden Daten in Athena haben:Athena (Presto) SQL Fensterfunktionen

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

ich möchte es Rang so:

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 

die Logik ist:
die Differenz zwischen dem Min Wert in der zweiten Gruppe und der maximale Wert in der ersten Gruppe ist größer als x

Ich denke eine Kombination von dense_rank() OVER (PARTITION BY id ...) könnte es auflösen, aber ich bin ein Neuling zu Fensterfunktionen in SQL.

Dank

+0

Was ist 'x' in diesem Beispiel? meinst du das zurücksetzen der gruppe wenn der unterschied von vorherigen ts> x? –

+0

genau, x ist nur ein bestimmter Schwellenwert – belostoky

+0

Klären Sie die Logik mit dem Datenbeispiel. Ihre Postdefinition stimmt nicht mit Ihrer Antwort auf @vkp überein –

Antwort

2

können Sie lag verwenden und die Differenz von der vorherigen Reihe von ts und setzen Sie ihn erhalten eine laufende Summe verwenden, wenn es> x geht.

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 

Ersetzen 3000 (x) in dem case Ausdruck mit dem Sollwert.