Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / количество подряд идущих записей / 15 сообщений из 15, страница 1 из 1
11.03.2019, 16:20
    #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
11.03.2019, 16:26
    #39784570
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
количество подряд идущих записей
Julia2000,

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

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

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

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

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

подряд согласно поля - i
просто последовательность может быть разорванной (удаленные записи, например)В таком случае вам надо писать вставку каждой записи отдельно своим INSERTом, чтобы было понятно, что вставили сначала, а что потом.
Или применить SET IDENTITY_INSERT t1 ON;
А поле i прописать в INSERT и в SELECTах явно.
...
Рейтинг: 0 / 0
11.03.2019, 16:39
    #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
11.03.2019, 16:55
    #39784600
iap
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
10.02.2020, 14:37
    #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
10.02.2020, 14:46
    #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
10.02.2020, 14:55
    #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
10.02.2020, 16:11
    #39924729
Rangil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
количество подряд идущих записей
court,

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


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