Как суммировать строки перед выполнением условия в SQL - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть таблица, в которой есть несколько записей для одного и того же идентификатора.Выглядит это так, и строки сортируются по порядковому номеру.

+----+--------+----------+----------+
| 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        |
+----+--------+----------+----------+

Например, для id=1, я хотел бы суммировать продолжительность для всех предыдущих строк и включить result=6, что составляет 7254+2333+1000+5.То же самое для id =2, это будет 230+10+0.Что-нибудь после строки, где result=6 будет опущено.

Мой ожидаемый результат:

+----+----------+
| id | duration |
+----+----------+
| 1  | 10592    |
+----+----------+
| 2  | 240      |
+----+----------+

Последовательность должна быть в порядке возрастания.

Яне уверен, как я могу сделать это в sql.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы можете использовать простой агрегированный запрос с условием, которое использует подзапрос для восстановления sequence, соответствующего записи, чья последовательность равна 6:

SELECT t.id, SUM(t.duration) total_duration
FROM mytable t
WHERE t.sequence <= (
    SELECT sequence
    FROM mytable
    WHERE id = t.id AND result = 6
)
GROUP BY t.id

Это демо на БД Fiddle с вашими результатами тестовых возвратов:

| id  | total_duration |
| --- | -------------- |
| 1   | 10592          |
| 2   | 240            |
0 голосов
/ 14 февраля 2019

Я думаю, что вы хотите:

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

В PrestoDB я бы порекомендовал оконные функции:

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;
0 голосов
/ 14 февраля 2019

Основная группа по запросу должна решить вашу проблему

select 
  id,
  sum(duration) duration
from t
group by id

для определенных строк:

select 
  id,
  sum(duration) duration
from t
where id = 1
group by id

, если вы хотите включить ее в набор результатов

select id, duration, sequence from t 
union all
select 
  id,
  sum(duration) duration
  null sequence
from t
group by id
...