Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
myrzilka Member Откуда: Сообщений: 54 |
Добрый день. Есть таблица вида Вид Модель Количество Компьютер a1 21 Компьютер a2 53 Компьютер a3 48 Принтер b1 26 Принтер b2 19 Принтер b3 45 Принтер b4 53 Принтер b5 17 при запросе select top 3 with ties * from table1 order by Row_number() OVER (PARTITION BY вид ORDER BY количество DESC) выводится только 1 строка - Компьютер и 2 строки - Принтер. Мне надо по три строки на каждый Вид. Что делаю не так? |
27 окт 17, 12:48 [20906048] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
myrzilka, неправильно понимаешь логику работы top N with ties. попробуй так: select top 1 * .... order by ceiling(Row_number() OVER (PARTITION BY вид ORDER BY количество DESC)/3.0) |
27 окт 17, 12:59 [20906150] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
with ties, конечно же....
|
||
27 окт 17, 12:59 [20906157] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8484 |
myrzilka, уберите top 3 with ties и посмотрите, что получится. |
27 окт 17, 13:00 [20906161] Ответить | Цитировать Сообщить модератору |
myrzilka Member Откуда: Сообщений: 54 |
Владислав Колосов, так мне же надо как раз выбрать top 3 + еще остальные, у которых такое же кол-во как у последнего. Только распределить его по Видам. Как же это сделать? with ties не подходит? select top with ties 1 * - выдает ошибку. |
27 окт 17, 14:15 [20906630] Ответить | Цитировать Сообщить модератору |
myrzilka Member Откуда: Сообщений: 54 |
Добрый Э - Эх, Спасибо! Получилось! Думаю, это то, что нужно. |
27 окт 17, 14:19 [20906657] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1968 |
вроде как это вчерашние яблоки и груши, только сегодня без суммы. может, все же такое надо? declare @t table (prod varchar(100), mod varchar(100), qty int); insert into @t values ('computer', 'a1', 21), ('computer', 'a2', 53), ('computer', 'a3', 48), ('printer', 'b1', 26), ('printer', 'b2', 19), ('printer', 'b3', 45), ('printer', 'b4', 53), ('printer', 'b5', 17); with cte as ( select distinct prod from @t ) select a.* from cte c cross apply (select top 3 with ties * from @t t where t.prod = c.prod order by qty desc)a; --- prod mod qty computer a2 53 computer a3 48 computer a1 21 printer b4 53 printer b3 45 printer b1 26 |
27 окт 17, 14:27 [20906717] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8484 |
Я же и пишет - смотрите, что при Вашей сортировке попадает в первые три записи. Никаких чудес нет - что выбрали, то и получили. |
||
27 окт 17, 16:50 [20907404] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |