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

Откуда:
Сообщений: 9
+ Исходные данные

 declare @Таблица table (ВТ char(9), Продажи int)
insert into @Таблица (ВТ, Продажи)
select ВТ = 'ВТ1', Продажи = 1
union all select ВТ = 'ВТ1', Продажи = 2
union all select ВТ = 'ВТ1', Продажи = 3
union all select ВТ = 'ВТ1', Продажи = 4
union all select ВТ = 'ВТ1', Продажи = 5
union all select ВТ = 'ВТ1', Продажи = 6
union all select ВТ = 'ВТ1', Продажи = 7
union all select ВТ = 'ВТ1', Продажи = 8
union all select ВТ = 'ВТ1', Продажи = 9
union all select ВТ = 'ВТ1', Продажи = 10
union all select ВТ = 'ВТ2', Продажи = 2
union all select ВТ = 'ВТ2', Продажи = 3
union all select ВТ = 'ВТ2', Продажи = 4 


+ Запрос

select top 20 percent with ties *
from @Таблица
order by row_number() over (partition by ВТ order by Продажи desc)



Вопрос:
Предполагалось, что данная конструкция выберет первые 20% записей от каждого ВТ (Вид товара) отсортированные по убыванию, однако запрос возвращает по 2 записи от каждого вида товара, что для ВТ2 неверно.
Пока обошелся примерно таким запросом, но не понятен механизм TOP WITH TIES

+ Рабочий запрос

select *
from 
-- Виды товаров в базе хранятся в отдельной таблице. Это для примера
	(select distinct ВТ
	 from @Таблица
	 ) As ВидыТоваров
cross apply
	(select top 20 percent Продажи
	 from @Таблица as Таб1
	 where Таб1.ВТ = ВидыТоваров.ВТ
	) as Продажи



+ select @@version

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
24 апр 12, 12:40    [12461992]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
Vasilev Andrey
Member

Откуда:
Сообщений: 9
Поправка: в рабочем запросе в cross apply забыл указать order by

select *
from 
	(select distinct ВТ
	 from @Таблица
	 ) As ВидыТоваров
cross apply
	(select top 20 percent Продажи
	 from @Таблица as Таб1
	 where Таб1.ВТ = ВидыТоваров.ВТ
	 order by Таб1.Продажи desc
	) as Продажи
24 апр 12, 12:42    [12462018]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Vasilev Andrey,
Вот из этого запроса и выбираем
select *
from @Таблица
order by row_number() over (partition by ВТ order by Продажи desc)


2.6 записи т.е. 3 записи
select top 20 percent *
from @Таблица
order by row_number() over (partition by ВТ order by Продажи desc)


with ties -- это ещё дополнительные записи
http://msdn.microsoft.com/ru-ru/library/ms189463.aspx
а как они выбираются и мне не понятно.
24 апр 12, 12:54    [12462185]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
with ties
Guest
trew
а как они выбираются и мне не понятно.

помимо первых записей всегда дочитываются записи с уже выбранными значениями полей сортировки.


declare @t table (a int, b int)


insert @t (a,b)
select 1,1
union all
select 1,2
union all
select 1,3
union all
select 1,4
union all
select 1,5
union all
select 1,6
union all
select 2,1


select top 1 percent with ties *
from @t 
order by a


Vasilev Andrey
в вашем случае дочитались все записи со значениями row_number() over (partition by ВТ order by Продажи desc) = 1 и 2
24 апр 12, 13:01    [12462275]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
читатель неместный
Guest
with ties ,

Озадачился я ..
А запрос ниже всегда же вернет одну запись по каждому значению колонки "а" ??
select top 1 with ties *
from @t
order by row_number() over (partition by a order by b)
--order by a
24 апр 12, 13:14    [12462453]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
with ties
Guest
читатель неместный
with ties ,

Озадачился я ..
А запрос ниже всегда же вернет одну запись по каждому значению колонки "а" ??
select top 1 with ties *
from @t
order by row_number() over (partition by a order by b)
--order by a

да, т.к. у всех этих записей будет row_number() over (partition by a order by b) = 1
24 апр 12, 13:16    [12462465]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
читатель неместный
Guest
харашо!!
а то я его пользую везде, где требуется подцепить "одну" дочку )
24 апр 12, 13:24    [12462543]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TOP WITH TIES  [new]
Vasilev Andrey
Member

Откуда:
Сообщений: 9
trew, with ties

Спасибо за разъяснения
24 апр 12, 13:32    [12462618]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить