1
votes

Comment additionner des lignes avant qu'une condition ne soit remplie dans SQL

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!


2 commentaires

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'id 1 , avec la valeur 7254 + 2333 + 1000 + 5 , et l'autre pour l'id 2 , avec la valeur 230 + 10 + 0 )?


@GMB oui c'est ce que je voulais dire, laissez-moi mettre ma sortie attendue


3 Réponses :


0
votes

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


2 commentaires

Cela ne fonctionne pas car je ne veux que certaines lignes, pas toutes.


vérifiez ma réponse à nouveau s'il vous plaît



1
votes

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            |


1 commentaires

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



1
votes

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
                    );


0 commentaires