powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / количество подряд идущих записей
15 сообщений из 15, страница 1 из 1
количество подряд идущих записей
    #39784566
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Подскажите, пожалуйста, как можно сделать: необходимо подсчитать количество подряд идущих фамилий, когда равно или более 3-х подряд, и когда менее 3-х подряд, сколько пустых - не важно. Какие фамилии тоже не важно, то есть просто 2 счетчика.
То есть в приведенном примере должно получится, что подряд 3 и более - 2шт, менее 3 - 5шт. Конечно i - не обязательно может быть непрерывным. MSSQL2005.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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'' 
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784570
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000,

сервер определяет, какая запись за какой идёт, периодически заглядывая в ваш блокнотик? Или как?
Что такое в вашем понимании "подряд"?
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784572
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapJulia2000,

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

Julia2000
Код: sql
1.
i int primary key identity
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784574
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

подряд согласно поля - i
просто последовательность может быть разорванной (удаленные записи, например)
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784577
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве insert into select гарантирует определённый порядок записи?
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784578
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

в данном случае подряд для меня соответствует порядку обеспеченным полем - i
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784581
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа разве insert into select гарантирует определённый порядок записи?
Ну это же просто пример данных.
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784583
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, ну какая разница, будет там потом поле с датой или еще что... это же просто пример, который меня устраивает
С row-number вроде получилось, хотя может и по-дурацки, но нужно на mssql2005
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784585
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000iap,

подряд согласно поля - i
просто последовательность может быть разорванной (удаленные записи, например)В таком случае вам надо писать вставку каждой записи отдельно своим INSERTом, чтобы было понятно, что вставили сначала, а что потом.
Или применить SET IDENTITY_INSERT t1 ON;
А поле i прописать в INSERT и в SELECTах явно.
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784592
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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'' 
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39784600
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просуммируйте результат по условиюJulia2000подряд 3 и более - 2шт, менее 3 - 5шт.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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);
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39924680
Фотография Rangil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
А как вывести вместо количества сами фамилии, но с условием, что записи с фамилиями следуют >= 3-х раз?
Из данного примера должны остаться только

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	select N'Petrov' union all
	select N'Ivanov' union all
	select N'Sidorov' union all

	select N'Petrov' union all
	select N'Sidorov' union all
	select N'Sidorov' union all
	select N'Ivanov' union all
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39924686
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rangil
iap,
А как вывести вместо количества сами фамилии, но с условием, что записи с фамилиями следуют >= 3-х раз?
Из данного примера должны остаться только

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	select N'Petrov' union all
	select N'Ivanov' union all
	select N'Sidorov' union all

	select N'Petrov' union all
	select N'Sidorov' union all
	select N'Sidorov' union all
	select N'Ivanov' union all


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
;with cte as (
	select 
		*
		,inv	=row_number()over(order by i) - row_number()over(partition by case when f='' then 0 else 1 end order by i) 
		,flag	=case when f='' then 0 else 1 end 
	from #t1
),
cte1 as (
	select
		*
		,cnt	=count(*)over(partition by inv, flag) 
	from cte
)	
select 
	i, f, inv 
from cte1
where  flag = 1 and cnt >= 3
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39924689
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
--DROP TABLE #t1

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'Ivanov' union all
	select N'' union all
	select N'' 

SELECT i, f, RN, N = MAX(I) OVER (PARTITION BY f, RN) - MIN(I) OVER (PARTITION BY f, RN) + 1 FROM 
(
SELECT i, f, RN = ROW_NUMBER() OVER (ORDER BY I) - ROW_NUMBER() OVER (PARTITION BY f ORDER BY i) 
FROM #t1
) C
ORDER BY i

DROP TABLE #t1
...
Рейтинг: 0 / 0
количество подряд идущих записей
    #39924729
Фотография Rangil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Спасибо большое! Всё верно!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / количество подряд идущих записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]