SQL возвращать несколько строк максимального значения? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть таблица с ценами и я хочу вернуть клиента, который потратил больше всего денег на товары. Мой запрос ie работает, но в случае, если у меня есть несколько клиентов с одинаковой потраченной суммой (макс.), Он не покажет их обоих, а только одного.

Запрос ie выглядит следующим образом:

SELECT u.FirstName,u.LastName,CustomerMail,max(Amount) from 
(select CustomerMail, sum(Price) as Amount from Ticket
group by CustomerMail),User u where CustomerMail = u.Email;

Кто-нибудь знает, как я могу вернуть всех клиентов на тот случай, если есть несколько человек, которые потратили точную сумму, как друг на друга?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Есть несколько вещей, о которых вы должны узнать SQL:

  • Использование JOIN.
  • Использование псевдонимов таблиц.
  • GROUP BY.

Вы используете «расширенную функциональность» в SQLite, смешивая функции агрегирования и неагрегированные столбцы во внешнем запросе. Это был бы неправильный синтаксически некорректный запрос почти в любой другой базе данных.

Канонический способ решения вашей проблемы использует оконные функции:

select u.FirstName, u.LastName, CustomerMail, sum_Amount
from (select t.CustomerMail, sum(t.Price) as sum_Amount,
             rank() over (order by sum(t.Price) desc) as seqnum    
      from Ticket t
      group by t.CustomerMail
     ) c join
     User u 
     ON t.CustomerMail = u.Email
where seqnum = 1;

Если вы хотите, чтобы в событии была только одна строка связей, тогда вы бы использовали row_number() вместо rank().

0 голосов
/ 22 февраля 2020

Используйте RANK() оконную функцию:

select FirstName, LastName, Email, amount
from (
  select u.FirstName, u.LastName, u.Email, sum(t.Price) amount,
    rank() over (order by sum(t.Price) desc) rn 
  from User u inner join Ticket t
  on t.CustomerMail = u.Email
  group by u.FirstName, u.LastName, u.Email
)
where rn = 1  

RANK() назначит номер для каждой суммы в порядке убывания, и если 2 или более суммы равны, они будут назначены тот же номер. Итак, наконец, все, что вам нужно, это суммы с рангом = 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...