ВЫБЕРИТЕ ТОП N с двумя переменными - PullRequest
4 голосов
/ 13 апреля 2010

У меня есть следующий пример в таблице SQL

Cust Group Sales
A   1   15
A   1   10
A   1   5
A   2   15      
A   2   10
A   2   5
B   1   15
B   1   10
B   1   5
B   2   15
B   2   10  
B   2   5

То, что я хотел бы показать, - это топ-2 продуктов на одного покупателя, отсортированные по убыванию по продажам, т. Е.

Cust Group Sales
A   1   15
A   1   10
A   2   15      
A   2   10
B   1   15
B   1   10
B   2   15
B   2   10

Я предполагаю, что мне нужно объявить две переменные, Cust и Group, я просто не уверен, как это сделать одним махом.

Извиняюсь за трудный вопрос ... нет оправдания. Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Привет, следующие работы в MSSQL2000

 SELECT tbl.Cust,
        tbl.Group,
        tbl.Sales

 FROM   MyTable tbl

 WHERE (SELECT COUNT(*) 
        FROM   MyTable tbl2 
        WHERE  tbl2.Sales > tbl.Sales 
        AND    tbl2.Group = tbl.Group 
        AND    tbl2.Cust = tbl.Cust) < 2

 ORDER  BY     tbl.Cust ASC, 
               tbl.Group ASC, 
               tbl.Sales DESC

Внутренний запрос Select Count(*) работает, считая, сколько записей находится над записью, которую он просматривает в данный момент - в этом случае вы хотите, чтобы b было 0 (1-е место) или 1 (2-е место).

Обратите внимание, что из-за этого, если у вас есть более 2 значений, разделяющих первое место (например, 3 A / 1 с продажами 15), вы получите более 2 результатов назад.

Однако для вашего набора тестов он возвращает правильные результаты, и использование DISTINCT поможет, если вы предпочтете получить меньше, чем больше результатов в этом случае. Кроме того, если ваши записи имеют отличный идентификатор записи, это может помочь вам выбрать между ними.

0 голосов
/ 13 апреля 2010

Вот тот, который вам нужен для запуска через SQL Server 2000:

select distinct t1.Cust, t1.GroupID, t1.Sale 
from Test t1 inner join Test t2 on t1.Cust = t2.Cust and t1.GroupID = t2.GroupID
where t1.Sale>t2.Sale
order by Cust, GroupID, Sale desc

его эквивалент работает на SQL Server 2005+:

select Cust, GroupID, Sale
from (
    SELECT *, rank() over(partition by Cust, GroupID order by sale desc) as n 
    FROM dbo.Test
     ) dt
where dt.n<=2
order by Cust, GroupID, Sale desc
...