2017-08-22 4 views
1

Il est difficile de formuler, donc je vais juste montrer un exemple et vous pouvez modifier ma question et mon titre.Supprimer les lignes, qui sont dupliquées et se suivent par conséquent

Supposons, j'ai une table

flag id value datetime 
0 b 1 343 13 
1 a 1 23 12 
2 b 1 21 11 
3 b 1 32 10 
4 c 2 43 11 
5 d 2 43 10 
6 d 2 32  9 
7 c 2 1  8 

Pour chaque id je veux COMPRESSION la table par flag colonnes de telle sorte que toutes les valeurs en double flag qui se suivent l'effondrement d'une ligne avec sum agrégation. Résultat souhaité:

flag id value 
0 b 1 343 
1 a 1 23 
2 b 1 53 
3 c 2 75 
4 d 2 32 
5 c 2 1 

PS: J'ai trouvé des fonctions comme CONDITIONAL_CHANGE_EVENT, qui semblent être en mesure de le faire, mais les exemples dans docs ne fonctionnent pas pour moi

+0

Y a-t-il une colonne pour spécifier la commande? –

+0

@ lad2025 La même logique - ils doivent s'effondrer en un –

+0

@VamsiPrabhala Malheureusement, non. Et je ne suis pas capable de l'ajouter. Mais j'ai une colonne 'date', qui est pratiquement la même –

Répondre

3

Utilisez le differnece de approche de numéro de ligne pour assigner des groupes basés sur des drapeaux de rangée consécutifs étant les mêmes. Ensuite, utilisez une somme courante.

select distinct id,flag,sum(value) over(partition by id,grp) as finalvalue 
from (
select t.*,row_number() over(partition by id order by datetime)-row_number() over(partition by id,flag order by datetime) as grp 
from tbl t 
) t 
1

est ici une approche qui utilise CONDITIONAL_CHANGE_EVENT:

select 
    flag, 
    id, 
    sum(value) value 
from (
    select 
     conditional_change_event(flag) over (order by datetime desc) part, 
     flag, 
     id, 
     value 
    from so 
) t 
group by part, flag, id 
order by part; 

Le résultat est différent de votre résultat souhaité indiqué dans la question en raison de order by datetime. L'ajout d'une colonne séparée pour le numéro de ligne et le tri sur ce qui donne le résultat correct.