2016-02-11 2 views
3

У меня есть таблица вроде этого:Разделить два ряда над Partition

Id Sym sum_amount pair 
11 2 1000  1 
11 3  500  1 
22 4 200  2 
22 4 50  2 

И я хотел бы разделить одно значение в паре во второй в той же паре над разделом по идентификатору, Sym.

и получить такие результаты:

Id Sym sum_amount pair Div 
11 2 1000  1 2 
11 3 500  1 0.5 
22 4 200  2 4 
22 4 50  2 0.25 

Я думаю, что нужно что-то вроде этого:

Ratio[???](Sum_Amount) Over (Partition by Id, Sym, pair) 

Любой способ сделать это? Я знаю, что я могу усреднить по паре, сумме и т. Д., Но я не знаю, как я могу сделать эти отношения? есть ли встроенная функция для отношения?

Спасибо.

+1

до сих пор не ясно. Что вы хотите разделить на что? –

+0

Хм, я думаю, пенни упала. Что делать, если их больше двух? Неверно ли данные образца? Я думаю, что '11 3' должно быть' 11 2', чтобы получить те же значения, что и первая строка. –

+0

@TimSchmelter. , , Имя столбца называется «пара», поэтому я считаю справедливым предположить, что есть два из них. –

ответ

3

Хммм. Вам нужно другое значение. Один из способов, чтобы получить min() и max() и выбрать другой один:

select id, sum, sum_amount, pair, 
     (case when max(sum_amount) over (partition by pair) = sum_amount 
      then sum_amount/min(sum_amount) over (partition by pair) 
      else sum_amount/max(sum_amount) over (partition by pair) 
     end) as div 
from t; 
+0

Целочисленное деление предотвращает правильные результаты, а 'sum' -' sym'. Я также думаю, что это должно быть «Partition by Id, Sym, pair». –

+0

@ Иордания. , , Если 'sum_amount' является целым числом, то умножьте на 1.0 или преобразуйте в соответствующий десятичный тип. –

0

Подобный подход Гордона, но с использованием КТР, избегая целочисленное деление, включая все три колонки по желанию (я предполагаю, что Sym=3 была опечатка в ваших данных образца):

WITH CTE AS 
(
    select id, Sym, sum_amount, pair, 
      minAmount = min(sum_amount) over (partition by Id, Sym, pair), 
      maxAmount = max(sum_amount) over (partition by Id, Sym, pair), 
      rMin = 1.0 * sum_amount/min(sum_amount) over (partition by Id, Sym, pair), 
      rMax = 1.0 * sum_amount/max(sum_amount) over (partition by Id, Sym, pair) 
    FROM t 
) 
SELECT id, Sym, sum_amount, pair, 
     Div = CASE WHEN sum_amount = maxAmount THEN rMin ELSE rMax END 
FROM CTE; 

sql-Fiddle