2016-09-05 5 views
1

На первой у меня есть таблица выплат, соответствующие данные выглядит следующим образомвислоухие и сумма групп только для одного из многих типов

id  | price | type  | ts 
------ | -------|----------|--------------------------- 
1  | 50  | Payment | 2016-06-24 16:01:00.000000 
2  | 15  | Payment | 2016-06-24 16:02:00.000000 
3  | 5  | Refund | 2016-06-24 16:03:00.000000 
4  | 10  | Payment | 2016-06-24 16:04:00.000000 
5  | 20  | Payment | 2016-06-24 16:05:00.000000 
6  | 40  | Withdraw | 2016-06-24 16:06:00.000000 
7  | 30  | Withdraw | 2016-06-24 16:07:00.000000 
8  | 15  | Payment | 2016-06-24 16:08:00.000000 
9  | 25  | Payment | 2016-06-24 16:09:00.000000 

то, что я хочу сложить все строки с типом = «Платеж» в виде сумма, начало и конец периода, все остальные должны быть одинаковыми, поэтому результат выглядит так

id  | price | type  | begin      | end 
------ | -------|----------|---------------------------|--------------------------- 
null | 65  | Payment | 2016-06-24 16:01:00.000000| 2016-06-24 16:02:00.000000 
3  | 5  | Refund | 2016-06-24 16:03:00.000000| 
null | 30  | Payment | 2016-06-24 16:04:00.000000| 2016-06-24 16:05:00.000000 
6  | 40  | Withdraw | 2016-06-24 16:06:00.000000| 
7  | 30  | Withdraw | 2016-06-24 16:07:00.000000| 
null | 40  | Payment | 2016-06-24 16:08:00.000000| 2016-06-24 16:09:00.000000 

также было бы полезно, если бы он имел некоторые флаги нравится это строка сгруппирована и поддержка для ограничения конечного результата

буровая установка ХТ теперь я остановился в попытке row_number, группу по, лаг, и другие, не могу найти правильный путь

UPD: ссылка на SQL скрипку с рабочим результата http://sqlfiddle.com/#!15/3cfea/1/0

ответ

2

Это немного сложнее. Вы можете использовать разницу в количестве строк, чтобы получить группы для платежей. Затем вы можете использовать case, чтобы применять его только к самим платежам (а не к другим значениям). Это выглядит следующим образом:

select (case when type <> 'payment' then id) as id, 
     sum(price) as price, 
     min(type) as type, 
     min(ts) as begin, 
     max(case when type = 'payment' then ts end) as end 
from (select t.*, 
      (row_number() over (order by id) - 
       row_number() over (partition by type order by id) 
      ) as grp 
     from t 
    ) t 
group by (case when type = 'payment' then grp end), 
     (case when type <> 'payment' then id end); 
+0

близко, но не то, что я ожидал, вот ссылка http://sqlfiddle.com/#!15/db9f6/1/0 – Neonailol

+0

мой плохой, забыл заказ, спасибо HTTP: // sqlfiddle.com/#!15/3cfea/1/0 – Neonailol