2015-07-14 5 views
1
[Raw data] 
A B C 
1 10 1 
1 10 2 
2 20 3 
2 20 4 
1 100 5 
1 100 6 

[Wanted result] 
A SUM_OF_B 
1 20 
2 40 
1 200 

Непонятно, что запрос имеет простое предложение «group by» и «dense_rank over partition by», потому что группировка работает со всеми строками. Однако я хочу группировать в состоянии заказа. Как написать правильный запрос?SQL группы по

+2

Кроме того, что упорядоченность на основе? Предполагаете ли вы, что исходные данные уже поступают в определенном порядке (плохая идея)? Или вы сортируете по столбцу B? – sstan

+0

@sstan спасибо. Я изменил вопрос. Добавление столбца C. – wiz

+0

Не мастер Oracle, но это должна быть приемлемая адаптация связанного ответа: http://www.sqlfiddle.com/#!4/58dcd/16 – Amadan

ответ

5

Вам необходимо определить группы смежных записей. Вы можете на самом деле сделать это, используя разницу чисел номеров строк - при условии, что c заказывает строки. Разница является постоянной для последовательных значений a, которые одинаковы:

select a, sum(b) 
from (select t.*, 
      (row_number() over (order by c) - 
       row_number() over (partition by a order by c) 
      ) as grp 
     from table t 
    ) t 
group by grp, a 
order by min(c); 
+1

@wiz http://stackoverflow.com/help/someone-answers;). –