2015-05-20 3 views
1

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

firstname, lastname , nb_payments 
a, b , 10 
a, b , 20 
b, a , 30 
b, a , 40 
b, b , 50 

Я хочу, чтобы выбрать 3 максимальные платежи, сгруппированных по пару FirstName, LastName

Выход желаемого, как это

firstname, lastname , top3 
b, a , 70 
b, b , 50 
a, b , 30 

Я сделал этот запрос: SELECT firstname, lastname , nb_payments as top3 FROM account ORDER BY nb_payments DESC LIMIT 3

Но это Безразлично» т добавить до nb_payments сгруппированных по пару FirstName, LastName

Любая помощь будет оценена спасибо

ответ

1

Вам необходимо просуммировать платежи и группы по firstname и lastname

SELECT firstname, lastname , SUM(nb_payments) 
FROM  account 
GROUP BY firstname, lastname 
ORDER BY 3 DESC LIMIT 3 
+0

Этот запрос не будет работать, поскольку он сначала суммирует все платежи по каждой учетной записи и заказы/лимиты после этого. То, как я это понимаю, заключается в том, что OP хочет получить сумму трех первых платежей за учетную запись для всех учетных записей. – Timo

+0

@TimoSta Если это действительно требование OP, вы правы, и этот запрос неисправен. – Mureinik

+0

@Mureinik Большое спасибо, это было именно то, что мне нужно. тройка выплат, сгруппированных по фамилии и имени – ulquiorra

1

Я думаю, это производит выходы:

select firstname, lastname, sum(nb_payments) 
from (select t.*, 
      row_number() over (partition by firstname, lastname 
           order by nb_payments desc) as seqnum 
     from table t 
    ) t 
where seqnum <= 3 
group by firstname, lastname; 
+0

Работает слишком большое спасибо, но я предпочитаю более легкое решение Mureinik, потому что я все еще новичок в sql – ulquiorra

+0

@ user902509. , , Эти два вопроса очень разные. Mureinik возвращает три строки * после того, как все строки были агрегированы. Это объединяет только три исходные строки, но возвращает все комбинации имен. Последнее - моя интерпретация вашего вопроса. –

1

Вот как я могу писать в оракуле, если он hel пс. есть и другие способы.

select * from(
    SELECT firstname, lastname , sum(nb_payments) as top3 FROM test group by firstname,lastname ORDER BY top3 desc) 
    where rownum <=3 
Смежные вопросы