Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вывод определенных строк из таблицы  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Есть таблица

code nameKolDateDocument
1Стол51.3.2014 565
2Стол65.3.2014567
3Стол36.3.2014588
....................
653Стол57.3.2014825
654Стул15.3.2014567
655Стул36.3.2014588
656Стул56.3.2014600
.................


И т.д. Таблица большая, упорядоченная в нужном мне порядке. Мне нужно вывести в каждой группе по name, допустим 3 строчку.

Версия
Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
	Feb 10 2012 19:39:15 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Хотел узнать как это реализовывается в 2012 версии. В 2008, я пускаю
 SELECT ROW_NUMBER() OVER(PARTITION BY Name Order by document) as rang
потом вывожу только
rang=3
в 2012 версии, появились новые функции ранжирования. Мне вот интересно, как это можно реализовать без подзапроса.
3 апр 14, 11:47    [15826142]     Ответить | Цитировать Сообщить модератору
 Re: вывод определенных строк из таблицы  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
minya13_85
как это можно реализовать без подзапроса.
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3), (1, 5),
(7, 1), (7, 5), (7, 9), (7, 11)

select top 1 with ties * from @t
order by case row_number() over(partition by ids order by val) when 3 then 1 else 2 end
3 апр 14, 11:58    [15826218]     Ответить | Цитировать Сообщить модератору
 Re: вывод определенных строк из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кавказ-сила
minya13_85
как это можно реализовать без подзапроса.
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3), (1, 5),
(7, 1), (7, 5), (7, 9), (7, 11)

select top 1 with ties * from @t
order by case row_number() over(partition by ids order by val) when 3 then 1 else 2 end
Не пойдёт!
Потому что если будет всего две строки, одна из них появится в результирующем датасете,
хотя требуются именно третьи строки!

А так-то и ещё проще можно было бы:
ORDER BY NULLIF(row_number() over(partition by ids order by val),3)
3 апр 14, 12:02    [15826246]     Ответить | Цитировать Сообщить модератору
 Re: вывод определенных строк из таблицы  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
iap
Потому что если будет всего две строки, одна из них появится в результирующем датасете,
хотя требуются именно третьи строки!
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3),
(7, 1), (7, 5), (7, 9), (7, 11)

select top 1 with ties * from @t
order by case row_number() over(partition by ids order by val) when 3 then 1 else 2 end
3 апр 14, 12:03    [15826258]     Ответить | Цитировать Сообщить модератору
 Re: вывод определенных строк из таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кавказ-сила
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3),
(7, 1), (7, 5), (7, 9), (7, 11)

select top 1 with ties * from @t
order by case row_number() over(partition by ids order by val) when 3 then 1 else 2 end
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3)

select top 1 with ties * from @t
order by case row_number() over(partition by ids order by val) when 3 then 1 else 2 end
3 апр 14, 12:05    [15826271]     Ответить | Цитировать Сообщить модератору
 Re: вывод определенных строк из таблицы  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
declare @t table(ids int, val int)
insert @t values
(1, 1), (1, 3)--, (1, 5),
--(7, 1), (7, 5), (7, 9), (7, 11)

select ids, val, 3 from @t intersect
select ids, val, row_number() over(partition by ids order by val) from @t 
3 апр 14, 12:18    [15826373]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить