Получить строку, в которой сумма значения соответствует условию - PullRequest
1 голос
/ 03 марта 2020

У меня есть таблица со столбцами:

  • дата (отметка времени)
  • число (целое число)

В CSV выглядит так:

"date","num"
"2018-02-07 00:00:00","1"
"2018-02-16 00:00:00","1"
"2018-03-02 00:00:00","4"
"2018-04-04 00:00:00","6"
"2018-06-07 00:00:00","1"

Я хочу, чтобы различные запросы выяснили следующее:

  1. A: самая ранняя дата, когда сумма чисел>> 1
  2. B: самая ранняя дата, когда сумма num равна> = 2

. В примерах данных выходные данные будут A : 2018-02-07 и B : 2018-02-16.

Обратите внимание, что если первая дата в данных имеет число больше 1, то A и B будут равны одной и той же дате.

Группировка и использование MIN (дата) было бы достаточно для удовлетворения A , но я не могу понять, как заставить B работать, если есть два дня с числом = 1 сразу за другим. Любые идеи приветствуются.

1 Ответ

1 голос
/ 03 марта 2020

Используйте накопительную сумму. Для одного числа:

select t.*
from (select t.*, sum(num) over (order by date) as running
      from t
     ) t
where running >= 1 and running - num < 1
order by date 
limit 1;

Если вам нужно несколько порогов одновременно:

select min(date) filter (where running >= 1) as date_1,
       min(date) filter (where running >= 2) as date_2    
from (select t.*, sum(num) over (order by date) as running
      from t
     ) t;

Или, если вы хотите, чтобы они были в отдельных строках:

select distinct on (threshold) v.threshold, t.*
from (select t.*, sum(num) over (order by date) as running
      from t
     ) t cross join
     (values (1), (2)) v(threshold)
where running >= threshold and running - num < threshold
order by threshold, date 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...