2017-06-29 1 views
0

J'ai une table qui contient des nombres. Je dois trouver s'il y a un cas où en n nombres consécutifs sont supérieurs à une certaine valeur de seuil m. Par exemple.SQL: Vérifie si n enregistrements consécutifs sont supérieurs à une certaine valeur

id  delta   
--------------- 
1  10 
4  15 
11  22 
23  23 
46  21 
57  9 

Voici donc, si je veux savoir s'il y a 3 enregistrements consécutifs où la valeur est supérieure à 20 alors que je devrais obtenir vrai. Et Faux quand je vérifie 4 enregistrements consécutifs. Est-ce possible? C'est sur Apache Spark SQL. Merci.

+0

Oui possible. Quel 'DBMS'? –

+0

Comme mentionné, c'est sur Apache Spark. Merci. –

+0

Initialement, il n'est pas étiqueté .. Je ne sais pas apache-spark .. Essayez les réponses ci-dessous –

Répondre

1

Vous pouvez le faire en utilisant lag:

select t.* 
from (select t.*, 
      lag(val, 1) over (order by id) as val_1, 
      lag(val, 2) over (order by id) as val_2 
     from t 
    ) t 
where val > 20 and val_1 > 20 and val_2 > 20; 

Ce retourne la première ligne qui fait partie de chaque trois certains. Si vous voulez juste vrai/faux:

select (case when count(*) > 0 then 'true' else 'false' end) 
from (select t.*, 
      lag(val, 1) over (order by id) as val_1, 
      lag(val, 2) over (order by id) as val_2 
     from t 
    ) t 
where val > 20 and val_1 > 20 and val_2 > 20; 

EDIT:

J'ai raté la partie de ne pas vouloir plus de 3. Ainsi, vous pouvez améliorer ceci:

select (case when count(*) > 0 then 'true' else 'false' end) 
from (select t.*, 
      lag(val, 1) over (order by id) as val_1, 
      lag(val, 2) over (order by id) as val_2, 
      lag(val, 3) over (order by id) as val_3, 
      lead(val, 1) over (order by id) as val_next_1 
     from t 
    ) t 
where (val_3 <= 20 or val_3 is null) and 
     (val_2 > 20 and val_1 > 20 and val > 20) and 
     (val_next_1 <= 20 or val_next_1 is null); 

Il est un peu difficile car les valeurs peuvent être au début ou à la fin des lignes.

+0

cela ne retournera pas «faux» s'il y a quatre valeurs consécutives supérieures au seuil – Vladislav

+0

Merci Gordon. Je vais essayer ça. –

+0

La partie intéressante serait cependant d'avoir les valeurs de seuil '3' et' 4' définies de façon déclarative, sinon j'utiliserais aussi 'LAG' et' LEAD' – Vladislav