2017-10-19 13 views
2

je le tableau suivant triés de manière spécifique (en HiveSQL):sous-ensemble sql ruche en fonction de première valeur et groupe unique

ID Binary UnnecessaryVar 
1 F   a 
1 F   b 
1 T   c 
1 F   d 
2 F   e 
2 T   f 
2 F   g 

je voudrais sélectionner toutes les lignes pour chaque ID avant le premier T variable binaire, y compris le dossier où la variable est T. le résultat de la solution appliquée à la table ci-dessus serait:

ID Binary UnnecessaryVar 
1 F   a 
1 F   b 
1 T   c 
2 F   e 
2 T   f 

Nous vous remercions à l'avance

+0

Il n'y a rien de tel que _first_ dans les tables. Vous devez spécifier l'ordre pour pouvoir trouver une première rangée. – jarlh

+0

Que faire s'il n'y a pas de «T»? –

+0

@GordonLinoff dans ce cas, il faut prendre tous les enregistrements qui sont faux – criticalth

Répondre

0

tables SQL représentent non ordonné ensembles. Il n'y a pas de "commande" sans colonne pour le spécifier. Si vous avez une clause order by, vous pouvez facilement ajouter une telle commande:

select . . . , 
     row_number() over (order by <keys used in order by>) as seqnum 
. . . 

Permettez-moi donc supposer que vous avez une telle colonne. Voici une méthode assez simple:

select q.* 
from (select q.*, 
      min(case when binary = 'T' then seqnum end) over 
       (partition by id) as seqnum_t 
     from <your query here> q 
    ) q 
where seqnum <= seqnum_t or seqnum_t is null; 
+0

Bien sûr, le jeu de données est ordonné d'une manière spécifique/significative, il est juste ni pertinent à la tâche, vous pouvez même créer la colonne si nécessaire (numéro de ligne pour exemple suffirait). Je vais essayer cela maintenant et revenir à vous. Merci – criticalth

+0

L'alias de la première ligne de votre requête doit-il être t. *? – criticalth