Выбор 3 лучших художников по странам в отношении доходов в SQLITE 3 - PullRequest
0 голосов
/ 11 октября 2018

У меня есть несколько таблиц, которые являются художниками, альбомами, треками, invoice_items, счетами, клиентами.

Я написал ниже SQL-запрос:

select country, artistid, name, revenue from 
(select t6.country, t1.artistid, t1.name, sum(t4.quantity*t4.unitprice) as revenue 
from artists 
t1 inner join albums t2 
inner join tracks t3 
inner join invoice_items t4 
inner join invoices t5 
inner join customers t6 on t1.artistid=t2.artistid 
and t2.albumid=t3.albumid 
and t3.trackid=t4.trackid 
and t4.invoiceid=t5.invoiceid 
and t5.customerid=t6.customerid 
group by t6.country, t1.artistid 
);

Вывод из запроса:

Output

Ожидаемый результат: Лучшие 3 исполнителя отсортированы по доходам для каждой страны.Так как мне нужно получить 3 лучших исполнителя в Аргентине, Австралии, Бразилии, США соответственно.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Используйте функцию ранга:

SELECT * FROM 
  (SELECT ARTISTID,
               NAME,
               COUNTRY,
               REVENUE,
               RANK () OVER (PARTITION BY COUNTRY ORDER BY REVENUE DESC) RANK
          FROM ARTISTS)
 WHERE RANK < 4

https://www.sqlite.org/windowfunctions.html

0 голосов
/ 11 октября 2018

В одном из вариантов используется коррелированный подзапрос для определения 5 крупнейших получателей дохода в каждой стране.Для удобства вы можете поместить текущий запрос в пересчитываемый CTE:

WITH yourTable AS (
    SELECT t6.country, t1.artistid, t1.name, SUM(t4.quantity*t4.unitprice) AS revenue
    FROM artists t1
    INNER JOIN albums t2 ON t1.artistid = t2.artistid
    INNER JOIN tracks t3 ON t2.albumid = t3.albumid
    INNER JOIN invoice_items t4 ON t3.trackid = t4.trackid
    INNER JOIN invoices t5 ON t4.invoiceid = t5.invoiceid
    INNER JOIN customers t6 ON t5.customerid = t6.customerid
    GROUP BY t6.country, t1.artistid, t1.name
)

SELECT t1.*
FROM yourTable t1
WHERE artistid IN (
    SELECT t2.artistid
    FROM yourTable t2
    WHERE t1.country = t2.country
    ORDER BY t2.revenue DESC, t2.name
    LIMIT 5
)
ORDER BY
    country, revenue DESC;

Демо

Обратите внимание, что я добавил уровень заказа по именив подзапросе LIMIT.Это делается для того, чтобы явно разорвать связь, если два или более артиста имеют одинаковый доход для данной страны.В этом случае в алфавитном порядке более ранние имена будут указываться первыми.

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