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