Несколько строк Max - PullRequest
       10

Несколько строк Max

0 голосов
/ 21 июня 2019

Мне нужно написать запрос, который определяет клиента, который больше всего потратил на музыку для каждой страны. Напишите запрос, который возвращает страну вместе с главным клиентом и сколько они потратили. Для стран, в которых распределена максимальная сумма, укажите всех клиентов, которые потратили эту сумму.

Вам необходимо использовать только таблицы клиентов и счетов-фактур.

Проверьте ваше решение

Несмотря на то, что существует только 24 страны, ваш запрос должен возвращать 25 строк, потому что в Соединенном Королевстве есть 2 клиента, которые имеют максимальное количество.

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

SELECT CustomerId , FirstName, LastName, Country, MAX(TotalSpent) AS  TotalSpent 
from  (select c.CustomerId as CustomerId, c.Firstname As FirstName,  c.LastName as LastName, i.BillingCountry as Country, SUM(i.Total) as TotalSpent
from customer c join invoice i
on c.CustomerId = i.CustomerId
   group by 1,2,3,4
   order by 5 desc
   limit by 1 ) AS temp
   group by 4

ожидаемый результат должен быть 25 строк, а не 24 Великобритания имеет две клиентские доли на одну и ту же сумму максимальной потраченной суммы

1 Ответ

0 голосов
/ 21 июня 2019

Этот следующий скрипт поможет вам получить требуемые результаты. Я использовал RANK в сценарии, чтобы выбрать одного или нескольких клиентов с максимальной суммой, отправленной в страну.

    WITH Customer(CustomerId,FirstName,LastName)
AS
(
    SELECT 1, '1 FN', '1 LN' UNION ALL
    SELECT 2, '2 FN', '2 LN'
),
Invoice(CustomerId,Country,Total)
AS
(
    SELECT 1, 'C 1', 100 UNION ALL
    SELECT 1, 'C 1', 35 UNION ALL
    SELECT 2, 'C 1', 80 UNION ALL
    SELECT 2, 'C 1', 80 UNION ALL
    SELECT 1, 'C 2', 50 UNION ALL   
    SELECT 2, 'C 2', 100 UNION ALL
    SELECT 1, 'C 2', 50 UNION ALL
    SELECT 1, 'C 3', 17 UNION ALL   
    SELECT 2, 'C 3', 17
)

SELECT 
    B.Country, 
    B.CustomerId, 
    C.FirstName, 
    C.LastName, 
    B.T AS TotalSpent
FROM
(
    SELECT *, 
           RANK() OVER(PARTITION BY Country
           ORDER BY Country, 
                    T DESC) RN
    FROM
    (
        SELECT i.Country, 
               C.CustomerId, 
               SUM(i.Total) T
        FROM Customer C
             INNER JOIN Invoice I ON c.CustomerId = i.CustomerId
        GROUP BY i.Country, 
                 C.CustomerId
    ) A
) B
INNER JOIN Customer C ON B.CustomerId = C.CustomerId
WHERE B.RN = 1
ORDER BY 1,2

Вывод (учитывая ввод CTE) -

Country   CustomerId    FirstName   LastName    TotalSpent
C 1       2             2 FN        2 LN        160
C 2       1             1 FN        1 LN        100
C 2       2             2 FN        2 LN        100
C 3       1             1 FN        1 LN        17
C 3       2             2 FN        2 LN        17
...