SQL Server: выберите N лучших записей в каждой категории: Count-Rank-Select в одном скрипте - PullRequest
0 голосов
/ 18 июня 2019

Существующие вопросы уже имеют подсчет базовых данных для каждой категории и затем рассматривают, как выбрать топ-10 для каждой категории, но можно ли сделать это сквозным в одном скриптето есть считать по категории, ранжировать по категориям и затем выбирать топ-10 по категориям?Я сделал первые 2, теперь интересно, как включить третий, то есть выбрать лучшие N результатов в том же сценарии:

;with cte as 
(
    select 
        custID, 
        day(tradedate) as TradeDate, 
        sum(tradecount) as TradeCountSum 
    from 
        tradetable
    where 
        tradedate >= '2018-6-17' 
    and 
        tradedate <= '2019-6-17'  
    group by 
        custID, 
        day(tradedate) 
)
select 
    custID, 
    tradedate, 
    TradeCountSum * 100 / sum(TradeCountSum) over (partition by custID) as TradeCountPercent 
    from cte 
    order by custID asc, TradeCountPercent desc 

Спасибо

1 Ответ

1 голос
/ 18 июня 2019

Один из способов сделать это - использовать ntile с набором результатов, а затем перенести его в производный запрос и использовать значение ntile в предложении where.

В приведенном ниже примере я разделил ваш набор результатов на 10% фрагментов, упорядоченных по убыванию tradecountpercent, а затем запросил верхний из них.

Я также удалил ";" перед предложением with, поскольку в этом нет необходимости, если оператор, предшествующий предложению with, заканчивается точкой с запятой.

declare @tradetable table (
    custid int,
    tradedate date,
    tradecount int
);

insert @tradetable (custid, tradedate, tradecount)
values
(1, '2018-06-17', 3),
(1, '2018-06-24', 1),
(1, '2018-07-02', 12),
(1, '2018-07-15', 4),
(1, '2018-07-21', 8),
(1, '2018-07-30', 56),
(1, '2018-08-29', 7),
(1, '2018-09-12', 2),
(1, '2018-10-17', 8),
(2, '2018-06-17', 3),
(2, '2018-06-24', 1),
(2, '2018-07-02', 12),
(2, '2018-07-15', 4),
(3, '2018-07-21', 8),
(3, '2018-07-30', 56),
(3, '2018-08-29', 7),
(3, '2018-09-12', 2),
(4, '2018-10-17', 8);


with cte as 
(
    select 
        custID, 
        day(tradedate) as TradeDate, 
        sum(tradecount) as TradeCountSum 
    from 
        @tradetable
    where 
        tradedate >= '2018-6-17' 
    and 
        tradedate <= '2019-6-17'  
    group by 
        custID, 
        day(tradedate) 
)

select * from (

select ntile(10)over(order by tradecountpercent desc) percents, * from
(
select 
    custID, 
    tradedate, 
    TradeCountSum * 100 / sum(TradeCountSum) over (partition by custID) as TradeCountPercent 
    from cte )x ) y where percents = 1
    order by custID asc, TradeCountPercent desc 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...