J'ai une table qui a plusieurs enregistrements pour le même identifiant. Cela ressemble à ceci, et les lignes sont triées par numéro de séquence.
+----+----------+ | id | duration | +----+----------+ | 1 | 10592 | +----+----------+ | 2 | 240 | +----+----------+
Par exemple. pour id = 1 , je voudrais additionner la durée de toutes les lignes précédentes et inclure result = 6 , soit 7254 + 2333 + 1000 + 5 . Idem pour id = 2 , ce serait 230 + 10 + 0 . Tout ce qui suit la ligne où result = 6 sera omis.
Ma sortie attendue:
+----+--------+----------+----------+ | id | result | duration | sequence | +----+--------+----------+----------+ | 1 | 12 | 7254 | 1 | +----+--------+----------+----------+ | 1 | 12 | 2333 | 2 | +----+--------+----------+----------+ | 1 | 11 | 1000 | 3 | +----+--------+----------+----------+ | 1 | 6 | 5 | 4 | +----+--------+----------+----------+ | 1 | 3 | 20 | 5 | +----+--------+----------+----------+ | 2 | 1 | 230 | 1 | +----+--------+----------+----------+ | 2 | 9 | 10 | 2 | +----+--------+----------+----------+ | 2 | 6 | 0 | 3 | +----+--------+----------+----------+ | 2 | 1 | 5 | 4 | +----+--------+----------+----------+ | 2 | 12 | 3 | 5 | +----+--------+----------+----------+
La séquence doit être dans l'ordre croissant.
Je ne sais pas comment je peux faire cela en SQL. Merci d'avance!
3 Réponses :
Le groupe de base par requête devrait résoudre votre problème
select id, duration, sequence from t union all select id, sum(duration) duration null sequence from t group by id
pour certaines lignes:
select id, sum(duration) duration from t where id = 1 group by id
si vous souhaitez l'inclure dans votre ensemble de résultats
select id, sum(duration) duration from t group by id
Cela ne fonctionne pas car je ne veux que certaines lignes, pas toutes.
vérifiez ma réponse à nouveau s'il vous plaît
Vous pouvez utiliser une simple requête agrégée avec une condition qui utilise une sous-requête pour récupérer la séquence correspondant à l'enregistrement dont la séquence est 6 :
| id | total_duration | | --- | -------------- | | 1 | 10592 | | 2 | 240 |
Oui calculer la somme mais pas "sauf celui correspondant à la dernière séquence", il peut y avoir plus d'enregistrements après "result = 6", donc je veux tout avant la ligne où "result = 6" pour tous les identifiants
Je pense que vous voulez:
select id, sum(duration)
from (select t.*,
min(case when result = 6 then sequence end) over (partition by id) as sequence_6
from t
) t
where sequence <= sequence_6;
Dans PrestoDB, je recommanderais les fonctions de fenêtre:
select t2.id, sum(t2.duration)
from t
where t.sequence <= (select t2.sequence
from t t2
where t2.id = t.id and t2.result = 6
);
Vous attendez donc un enregistrement dans l'ensemble de résultats pour chaque
id, ce qui signifie que vos exemples de données donneraient deux enregistrements (un pour l'id1, avec la valeur7254 + 2333 + 1000 + 5, et l'autre pour l'id2, avec la valeur230 + 10 + 0)?@GMB oui c'est ce que je voulais dire, laissez-moi mettre ma sortie attendue