2017-03-09 1 views
2

Voici mon ensemble de données:Drapeau des lignes spécifiques dans impala

IDX SESSION_ID 
1 Null 
2 Null 
3 Foo 
4 Foo 
5 Foo 
6 Null 
7 Bar 
8 Bar 

Je voudrais ajouter une colonne de drapeau qui est égal à 1 si ma ligne est une nouvelle session (je définis par la nouvelle session, le fait que la session ID changement quand je commande par IDX)

Dans ce cas, la sortie serait:

IDX SESSION_ID N_Session 
1 Null  1 
2 Null  0 
3 Foo   1 
4 Foo   0 
5 Foo   0 
6 Null  1 
7 Bar   1 
8 Bar   0 

Comment puis-je faire en utilisant impala sql? (ANSI SQL doit être bien aussi, je suppose)

Répondre

1

Essayez cette requête:

SELECT t1.IDX, 
     t1.SESSION_ID, 
     CASE WHEN t1.IDX = 1 OR 
       t1.SESSION_ID IS NULL AND t2.SESSION_ID IS NOT NULL OR 
       t1.SESSION_ID IS NOT NULL AND t2.SESSION_ID IS NULL OR 
       COALESCE(t1.SESSION_ID, 'a') <> COALESCE(t2.SESSION_ID, 'a') 
      THEN 1 
      ELSE 0 END AS N_Session 
FROM yourTable t1 
LEFT JOIN yourTable t2 
    ON t1.IDX = t2.IDX + 1 

Voici un tableau montrant ce que le résultat temporaire de la jointure devrait ressembler à:

IDX SESSION_ID IDX2 SESSION_ID2 N_Session 
1 Null   NULL NULL   1   <-- first row, 1 
2 Null   1  NULL   0   <-- session values agree, 0 
3 Foo   2  NULL   1   <-- values different, 1 
4 Foo   3  Foo   0 
5 Foo   4  Foo   0 
6 Null   5  Foo   1   <-- values different, 1 
7 Bar   6  NULL   1 
8 Bar   7  Bar   0 

Il devrait être clair que nous voulons marquer N_Session avec 1 dans l'un des deux cas suivants:

  • les deux ID de session font pas d'accord
  • les deux identifiants de session sont d'accord, mais la ligne est la première ligne (IDX valeur de 1)

La verbosité de ma requête provient d'avoir à gérer NULL valeurs. Si je lis correctement votre logique, deux valeurs NULL doivent être traitées comme la même valeur, ce qui peut ne pas être le cas avec Impala SQL utilisant certains opérateurs.

1
select IDX 
     ,SESSION_ID 

     ,case 
      when coalesce (SESSION_ID,'') 
       = lag(coalesce(SESSION_ID,'')) over (order by IDX) 
      then 0 
      else 1 
     end   as N_Session 

from mytable2 
; 

+-----+------------+-----------+ 
| idx | session_id | n_session | 
+-----+------------+-----------+ 
| 1 | NULL  | 1   | 
| 2 | NULL  | 0   | 
| 3 | Foo  | 1   | 
| 4 | Foo  | 0   | 
| 5 | Foo  | 0   | 
| 6 | NULL  | 1   | 
| 7 | Bar  | 1   | 
| 8 | Bar  | 0   | 
+-----+------------+-----------+ 
+0

Cela ne fonctionnera que dans '5.2.0 CCQ (Impala 2.0.0)' ou tard. –

+0

@TimBiegeleisen - Impala 2.0.0 date de sortie était Octobre 2014 –

+0

Eh bien, c'est une bonne chose que vous avez mis à jour à temps pour que votre requête fonctionne^^ –