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

Откуда:
Сообщений: 5
Здравствуйте.
Подскажите, пожалуйста, как можно сделать: необходимо подсчитать количество подряд идущих фамилий, когда равно или более 3-х подряд, и когда менее 3-х подряд, сколько пустых - не важно. Какие фамилии тоже не важно, то есть просто 2 счетчика.
То есть в приведенном примере должно получится, что подряд 3 и более - 2шт, менее 3 - 5шт. Конечно i - не обязательно может быть непрерывным. MSSQL2005.
create table t1 (i int primary key identity, f nvarchar(15))

insert into t1 (f)
	select N'' union all
	select N'Ivanov' union all
	select N'Petrov' union all
	select N'' union all
	select N'' union all
	select N'Petrov' union all
	select N'Ivanov' union all
	select N'Sidorov' union all
	select N'' union all
	select N'Petrov' union all
	select N'' union all
	select N'Petrov' union all
	select N'' union all
	select N'' union all
	select N'Petrov' union all
	select N'Sidorov' union all
	select N'Sidorov' union all
	select N'Ivanov' union all
	select N'' union all
	select N'' union all
	select N'Ivanov' union all
	select N'' union all
	select N'Ivanov' union all
	select N'Ivanov' union all
	select N'' union all
	select N'' 
11 мар 19, 16:20    [21829387]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46635
Julia2000,

сервер определяет, какая запись за какой идёт, периодически заглядывая в ваш блокнотик? Или как?
Что такое в вашем понимании "подряд"?
11 мар 19, 16:26    [21829395]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
msLex
Member

Откуда:
Сообщений: 5797
iap
Julia2000,

сервер определяет, какая запись за какой идёт, периодически заглядывая в ваш блокнотик? Или как?
Что такое в вашем понимании "подряд"?


Julia2000
i int primary key identity
11 мар 19, 16:28    [21829402]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
Julia2000
Member

Откуда:
Сообщений: 5
iap,

подряд согласно поля - i
просто последовательность может быть разорванной (удаленные записи, например)
11 мар 19, 16:28    [21829404]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
Konst_One
Member

Откуда:
Сообщений: 11087
а разве insert into select гарантирует определённый порядок записи?
11 мар 19, 16:29    [21829409]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
Julia2000
Member

Откуда:
Сообщений: 5
Konst_One,

в данном случае подряд для меня соответствует порядку обеспеченным полем - i
11 мар 19, 16:30    [21829411]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
msLex
Member

Откуда:
Сообщений: 5797
Konst_One
а разве insert into select гарантирует определённый порядок записи?

Ну это же просто пример данных.
11 мар 19, 16:31    [21829413]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
Julia2000
Member

Откуда:
Сообщений: 5
Ребят, ну какая разница, будет там потом поле с датой или еще что... это же просто пример, который меня устраивает
С row-number вроде получилось, хотя может и по-дурацки, но нужно на mssql2005
11 мар 19, 16:34    [21829422]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46635
Julia2000
iap,

подряд согласно поля - i
просто последовательность может быть разорванной (удаленные записи, например)
В таком случае вам надо писать вставку каждой записи отдельно своим INSERTом, чтобы было понятно, что вставили сначала, а что потом.
Или применить SET IDENTITY_INSERT t1 ON;
А поле i прописать в INSERT и в SELECTах явно.
11 мар 19, 16:35    [21829425]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
Julia2000
Member

Откуда:
Сообщений: 5
create table t1 (i int, f nvarchar(15))

insert into t1 (i, f)
	select 1, N'' union all
	select 2, N'Ivanov' union all
	select 3, N'Petrov' union all
	select 4, N'' union all
	select 5, N'' union all
	select 6, N'Petrov' union all
	select 7, N'Ivanov' union all
	select 8, N'Sidorov' union all
	select 9, N'' union all
	select 10, N'Petrov' union all
	select 11, N'' union all
	select 12, N'Petrov' union all
	select 13, N'' union all
	select 14, N'' union all
	select 15, N'Petrov' union all
	select 16, N'Sidorov' union all
	select 17, N'Sidorov' union all
	select 18, N'Ivanov' union all
	select 19, N'' union all
	select 20, N'' union all
	select 21, N'Ivanov' union all
	select 25, N'' union all
	select 26, N'Ivanov' union all
	select 27, N'Ivanov' union all
	select 28, N'' union all
	select 29, N'' 
11 мар 19, 16:39    [21829438]     Ответить | Цитировать Сообщить модератору
 Re: количество подряд идущих записей  [new]
iap
Member

Откуда: Москва
Сообщений: 46635
Просуммируйте результат по условию
Julia2000
подряд 3 и более - 2шт, менее 3 - 5шт.

USE tempdb;
if object_id(N'tempdb..#t1') IS NOT NULL DROP TABLE #t1;
GO
create table #t1 (i int primary key identity, f nvarchar(15))

insert #t1(f) values(N'');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'Petrov');
insert #t1(f) values(N'');
insert #t1(f) values(N'');
insert #t1(f) values(N'Petrov');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'Sidorov');
insert #t1(f) values(N'');
insert #t1(f) values(N'Petrov');
insert #t1(f) values(N'');
insert #t1(f) values(N'Petrov');
insert #t1(f) values(N'');
insert #t1(f) values(N'');
insert #t1(f) values(N'Petrov');
insert #t1(f) values(N'Sidorov');
insert #t1(f) values(N'Sidorov');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'');
insert #t1(f) values(N'');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'Ivanov');
insert #t1(f) values(N'');
insert #t1(f) values(N'');

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(ORDER BY i)-ROW_NUMBER()OVER(PARTITION BY f ORDER BY i),* FROM #t1)
SELECT f,с=MIN(i),по=MAX(i),количество=COUNT(*)
FROM CTE
GROUP BY N,f
HAVING f<>''
ORDER BY MIN(i);
11 мар 19, 16:55    [21829463]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить