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

Откуда: Кострома
Сообщений: 146
Чем раньше были живы без этой конструкции?
19 май 16, 20:58    [19195759]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
COUNT(*)
19 май 16, 21:06    [19195769]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
_djХомяГ
Guest
+ FAQ
20 май 16, 09:04    [19196565]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
aleks2
Guest
iap
COUNT(*)

Садись - неуд.

identity() + временная таблица.
20 май 16, 09:13    [19196601]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
aleks2,

садись неуд. "ROW_NUMBER OVER PARTITION BY" даст номер группе, identity не решает
20 май 16, 09:15    [19196606]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
TaPaK
aleks2,

садись неуд. "ROW_NUMBER OVER PARTITION BY" даст номер группе, identity не решает

а подумать перед тем как писать аби шо ?
20 май 16, 09:40    [19196691]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Maxx,

автор
PARTITION BY value_expression
Делит результирующий набор, полученный по предложению FROM, на секции, к которым применяется функция ROW_NUMBER. value_expression определяет столбец, по которому секционируется результирующий набор. Если PARTITION BY не указан, функция обрабатывает все строки результирующего набора запроса как одну группу. Дополнительные сведения см. в разделе Предложение OVER (Transact-SQL).
20 май 16, 09:43    [19196703]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
TaPaK, дык номера даются не группам, а "строкам в секции результирующего набора, где 1 соответствует первой строке в каждой из секций". :)
20 май 16, 09:47    [19196714]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
skyANA,

эгешь

автор
даст номер группе
либо я падежи не знаю либо "в" пропущено :)
20 май 16, 09:49    [19196721]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
aleks2
iap
COUNT(*)

Садись - неуд.

identity() + временная таблица.
Привет, Алекс!
20 май 16, 09:59    [19196769]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
aleks2
Guest
TaPaK
aleks2,

садись неуд. "ROW_NUMBER OVER PARTITION BY" даст номер группе, identity не решает


Это ты не умеешь.
20 май 16, 10:23    [19196851]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
TaPaK
identity не решает
Эх, вспомним молодость :)
declare @t table (g int, v int);

insert into @t
values
 (1, 1), (1, 2),
 (2, 4), (2, 3);

declare @temp table (g int, v int, n int identity);

insert into @temp
select g, v from @t order by g, v;

select
 a.g, a.v, a.n - b.n + 1
from
 @temp a join
 (select g, min(n) from @temp group by g) b(g, n) on b.g = a.g;
20 май 16, 11:17    [19197105]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
invm,

и то верно
можно и так
автор
select
a.*,
(
SELECT COUNT(*) +1
FROM @temp x
WHERE
a.g = x.g AND
x.n < a.n
)
from
@temp a

а вообще если есть уникальный разрез внутри группы то identity не надо
20 май 16, 11:51    [19197353]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
TaPaK
можно и так
Можно. Только невыгодно.
TaPaK
а вообще если есть уникальный разрез внутри группы то identity не надо
Если номер определяется несколькими столбцами, хоть уникальным их сочетанием внутри группы, хоть нет, то без identity не обойтись.
Поэтому лучше уж сразу identity. Это и выгоднее и универсальнее.
20 май 16, 12:22    [19197557]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
invm,

нет пределу извращениям :)
declare @t table (g int, v int,q varchar(5));

insert into @t
values
 (1, 1,'AAA'), (1, 2,'AAB'),(1, 1,'AAC'), (1, 7,'AAD'),
 (2, 4,'AAA'), (2, 3,'AAB');


declare @temp table (g int, v int, q varchar(5), n int identity);

insert into @temp
select g, v,q from @t order by g, v,q;

select
 a.g, a.v, a.q, a.n - b.n + 1
from
 @temp a join
 (select g, min(n) from @temp group by g) b(g, n) on b.g = a.g;

SELECT 
a.*,
rn = (
	SELECT COUNT(*) 
	FROM @T x
	WHERE 
		a.g = x.g	AND
		CAST(x.v as VarChar(5)) +  x.q <= CAST(a.v as VarChar(5)) +  a.q 
) 
from @T a
ORDER BY 
	a.g,rn
20 май 16, 12:28    [19197607]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
я, конечно, сильно не проверял, но по планам запрос с COUNT выгоднее... хотя вопрос объёмов и тд не снимается
20 май 16, 12:31    [19197631]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
anc32,
А в связи с чем вообще задан такой вопрос? Вам на древней версии приходиться разрабатывать?

Применительно к какой задаче вы не хотите использовать оконную функцию?
20 май 16, 14:34    [19198492]     Ответить | Цитировать Сообщить модератору
 Re: Чем можно заменить ROW_NUMBER OVER PARTITION BY?  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
TaPaK
я, конечно, сильно не проверял, но по планам запрос с COUNT выгоднее
Не имеет смысла сравнивать на табличных переменных и столь мизерных объемах.
left join (select count(*) ...) даст гарантированный NL, со всеми вытекающими.

Если сравнить нормально, то:
+
use tempdb;
go

create table dbo.t (id int primary key, g int, v int);

insert into dbo.t
select top (1000000)
 row_number() over (order by (select 1)),
 row_number() over (order by (select 1)) / 1000,
 row_number() over (order by (select 1)) % 1000
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

create index IX_t__g__v on dbo.t (g, v);
go

declare @r table(method varchar(30), [elapsed time, ms] int);

declare @rn int, @dt datetime2 = sysdatetime();

select identity(int, 1, 1) as rn, id, g, v into #t from dbo.t order by g, v option(maxdop 1);
create index IX_#t__g__v on #t (g, v) include (rn);

set statistics xml, io on;
select
 @rn = a.rn - b.rn + 1
from
 #t a join
 (select g, min(rn) from #t group by g) b(g, rn) on b.g = a.g
option
 (maxdop 1);
set statistics xml, io off;

insert into @r
select 'identity', datediff(ms, @dt, sysdatetime());

select @dt = sysdatetime();

set statistics xml, io on;
select
 @rn = (select count(*) from dbo.t where g = a.g and v <= a.v)
from
 dbo.t a
option
 (maxdop 1);
set statistics xml, io off;

insert into @r
select 'count(*)', datediff(ms, @dt, sysdatetime());

select * from @r
go

drop table dbo.t, #t;
go
methodelapsed time, ms
identity1909
count(*)43604
20 май 16, 15:00    [19198711]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить