Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выбрать N+ количество строк (пока значение не изменилось) / 25 сообщений из 39, страница 1 из 2
23.01.2022, 14:31
    #40128796
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Здравствуйте. Подскажите, пожалуйста, как найти первые Х, точнее Х+ записей, чтобы заканчивались до нового значения в столбце.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table #t (i int identity, n int)
go

insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5)



То есть, например, нужно выбрать 10 первых строк, но так как значение n не закончилось (не изменилось) на 11-ой строке, а продолжилось, то необходимо все выбрать все строки с n 1, 2, 3 и 4, то есть пока n не изменилось, то есть 12 строк. Порядок строк обеспечивает i.
То есть, если задача будет выбрать 12 строк, то выберутся только 12, так как по полю n следующие изменения будут на 13-ой строке.
...
Рейтинг: 0 / 0
23.01.2022, 14:39
    #40128797
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Разучить RANK() over().

Или

Код: sql
1.
select top(10) with ties...
...
Рейтинг: 0 / 0
23.01.2022, 14:43
    #40128798
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
--del--
...
Рейтинг: 0 / 0
23.01.2022, 14:45
    #40128799
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Извините, возможно это важно, MS SQL 2008 R2
...
Рейтинг: 0 / 0
23.01.2022, 15:32
    #40128807
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222,

Извините, но совершенно не поняла, как я могу полезно применить здесь RANK() OVER
...
Рейтинг: 0 / 0
23.01.2022, 16:22
    #40128821
3unknown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Код: sql
1.
2.
3.
4.
5.
declare @c int = 10


	select* from #t
	where n<=(select n from #t where i=@c)
...
Рейтинг: 0 / 0
23.01.2022, 17:22
    #40128832
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Julia2000
aleks222,
Извините, но совершенно не поняла, как я могу полезно применить здесь RANK() OVER

Не поняла - значит надо учиться лучше.
Чем тебе ties не угодили?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table #t (i int identity, n int)
go

insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5);

select top(10) with ties * from #t order by n;
...
Рейтинг: 0 / 0
23.01.2022, 21:12
    #40128862
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222
Чем тебе ties не угодили?
Julia2000
Порядок строк обеспечивает i.
...
Рейтинг: 0 / 0
24.01.2022, 06:17
    #40128919
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
invm
aleks222
Чем тебе ties не угодили?
Julia2000
Порядок строк обеспечивает i.

Проблема прям...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- кондово
with t as ( select * from #t)
   , n as ( select top(10) * from t order by i )
   , l as ( select top(1) * from n order by i desc )
   , i as ( select i = min(i) from t where i >= (select i from l) and n <> (select n from l) )
   select * from t where i < isnull( (select i from i), (select i from l) + 1 ) 
;
-- прогрессивно
with t as ( select * from #t )
   , l as ( select * from t order by i offset 10 - 1 rows fetch first 1 rows only )
   , i as ( select i = min(i) from t where i >= (select i from l) and n <> (select n from l) )
   select * from t where i < isnull( (select i from i), (select i from l) + 1 ) 

-- да, тут есть небольшая проблема... ну пускай тредстартерша ее сама обруливает
...
Рейтинг: 0 / 0
24.01.2022, 16:53
    #40129098
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Всем спасибо!
Но, оказалось одно дополнительное условие. Последовательность строк все также обеспечивает поле i.
Если n изменилось, то остальные n (с большим i) со значением 4 в выборку не нужно включать. Естественно остаются все предыдущие условия.

Код: 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.
create table #t (i int identity, n int)
go
insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5)
	, (4)

--select * from #t
declare @cnt int = 12;
select top (@cnt) t1.i, t1.n from #t t1 --order by t1.i asc
union all
select top 100 percent t.i, t.n 
	from #t t
	where 
		(select top 1 t2.i from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) < t.i 
		and
		(select top 1 t2.n from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) = t.n 
		and
		(
		select top 1 t.i 
			from #t t
			where 
				(select top 1 t2.i from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) + 1 < t.i 
				and
				(select top 1 t2.n from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) <> t.n 
			order by t.i asc
		) > t.i



Сделала так. Вроде, все правильно работает. То есть n = 4 с i = 16 не выбирает.
Можно ли как-то проще это сделать?
Спасибо )
...
Рейтинг: 0 / 0
24.01.2022, 17:20
    #40129113
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Julia2000
Всем спасибо!
Но, оказалось одно дополнительное условие. Последовательность строк все также обеспечивает поле i.
Если n изменилось, то остальные n (с большим i) со значением 4 в выборку не нужно включать. Естественно остаются все предыдущие условия.

Код: 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.
create table #t (i int identity, n int)
go
insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5)
	, (4)

--select * from #t
declare @cnt int = 12;
select top (@cnt) t1.i, t1.n from #t t1 --order by t1.i asc
union all
select top 100 percent t.i, t.n 
	from #t t
	where 
		(select top 1 t2.i from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) < t.i 
		and
		(select top 1 t2.n from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) = t.n 
		and
		(
		select top 1 t.i 
			from #t t
			where 
				(select top 1 t2.i from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) + 1 < t.i 
				and
				(select top 1 t2.n from (select top (@cnt) t1.i, t1.n from #t t1 order by t1.i asc) t2 order by t2.i desc) <> t.n 
			order by t.i asc
		) > t.i



Сделала так. Вроде, все правильно работает. То есть n = 4 с i = 16 не выбирает.
Можно ли как-то проще это сделать?
Спасибо )


Що вы пишите господа в годе 2022?

Код: sql
1.
LAG(t1.n) OVER (ORDER BY i)


Код: sql
1.
LEAD(t1.n) OVER (ORDER BY i)
...
Рейтинг: 0 / 0
24.01.2022, 17:28
    #40129116
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
a_voronin,

На MSSQL2008 это работает?
...
Рейтинг: 0 / 0
24.01.2022, 18:49
    #40129150
3unknown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Код: 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.
drop table if exists #t
create table  #t (i int identity, n int)
go

insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5)

	declare @num int = 12

	select * 
	from #t 
	where i<@num
	union 
	select t.* 
	from #t t
	join(
	select n,min(i) min_i,max(i) max_i
	from #t
	where i<=@num
	group by n
	) t1 on @num between t1.min_i and t1.max_i
	and t.n = t1.n
...
Рейтинг: 0 / 0
25.01.2022, 05:07
    #40129186
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
3unknown,

Спасибо!

Оказалось, что мой вариант в текущем виде неправильный.
...
Рейтинг: 0 / 0
25.01.2022, 07:13
    #40129192
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
3unknown
Код: 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.
drop table if exists #t
create table  #t (i int identity, n int)
go

insert into #t(n)
	values 
	(1), (1),  
	(2), (2), (2), (2),
	(3), (3), 
	(4), (4), (4), (4),
	(5), (5), (5)

	declare @num int = 12

	select * 
	from #t 
	where i<@num
	union 
	select t.* 
	from #t t
	join(
	select n,min(i) min_i,max(i) max_i
	from #t
	where i<=@num
	group by n
	) t1 on @num between t1.min_i and t1.max_i
	and t.n = t1.n


Зачем этот ужасный ужос?
...
Рейтинг: 0 / 0
02.02.2022, 00:30
    #40131132
ValK412
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Julia2000,м.б. интересен вариант через рекурсию
Код: sql
1.
2.
3.
4.
5.
6.
7.
with rC as( 
select 1 as num,0 as prev, i,n from #t where i=1
union all
select num+1 as num,rC.n as prev,#t.i,#t.n from #t inner join rC on #t.i=rC.num+1
	where num<10 or rc.prev=#t.n
) 
select * from rC
...
Рейтинг: 0 / 0
03.02.2022, 06:25
    #40131406
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
create table #t (i int identity, n int, x tinyint)
go

insert into #t(n, x)
	values 
	(1, 1), (1, 2), (1, 3), 
	(2, 1), (2, 1), (2, 2), (2, 3),
	(3, 1), (3, 1), (3, 2), 
	(4, 1), (4, 1), (4, 2), (4, 2),
	(4, 3), (5, 1), (5, 2), 
	(6, 1), (6, 2), (6, 3), (6, 4),
	(7, 1), (7, 2), (7, 3),
	(3, 3), (3, 3), (3, 3), (3, 3),
	(8, 1), (8, 2), (8, 2),
	(9, 1), (4, 4), (4, 4),
	(11, 1), (11, 2), (11, 3),
	(12, 2), (4, 5), (4, 6),
	(10, 1), (10, 1), (10, 2), (10, 3),
	(4, 7), (4, 7), (4, 7), (4, 7)

select * from #t

declare @q int = 25;

select *
from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts order by ts.i) t

select tr.* 
	from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) tr
	where tr.i <
		(
		case
		when exists 
			(
			select top 1 t.i
			from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t
			where 
				t.n <> (select top 1 t1.n from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t1 where t1.i = @q) 
				and 
				t.i > @q 
			order by t.i asc
			)
		then
			(
			select top 1 t.i
			from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t
			where 
				t.n <> (select top 1 t1.n from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t1 where t1.i = @q) 
				and 
				t.i > @q 
			order by t.i asc
			)
		when
			(select top 1 t.n from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t order by t.i desc)
			= 
			(select top 1 t.n from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t where t.i = @q)
		then
			(
			select top 1 t.i + 1 from (select top 100 percent row_number() over(order by ts.i) i, ts.n n, ts.x x from #t ts where ts.n is not null order by ts.i) t order by t.i desc
			)
		else
			null
		end
		)

drop table #t



Здравствуйте.
Возможно я плохо объяснила задачу ))
Я ее выполнила так. Это рабочее решение. Возможно не оптимальное, но работает правильно.
Смысл, @q - задает количество записей, которые нужны от начала, но, если последующие значения n равны значению n этой строки, то их тоже нужно включить в выборку. Если n есть дальше, но оно прерывалось, то те значения уже не нужны.

Например, при @q = 12 (i = 12), n = 4, но значение 4 продолжается по i = 15, вот по эту строку и нужно включить в выборку, а остальные с n = 4 (и другими значениями n) и i > 15 уже не нужны, так последовательность подряд n = 4 прекратилась/изменилась. Также, если @q = 33 (i = 33), то нужно выбрать строки по i = 34. То есть последовательность обеспечивает i и выборка с минимального значения i и по i=q, но до тех пор, пока n не изменится.
Надеюсь, понятно объяснила.
Всем Спасибо!
...
Рейтинг: 0 / 0
03.02.2022, 07:39
    #40131407
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Мягко сказать... "ваше решение ужасно" - это даже на политкорректность не тянет, это сверхгуманизм.

Это говнокод.
Увы.

Ортодоксально
Код: sql
1.
2.
3.
4.
5.
6.
7.
with t as ( select * from #t)
   , n as ( select top(@q) * from t order by i )
   , l as ( select top(1) * from n order by i desc )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)



Можно немножко прогрессивнее
Код: sql
1.
2.
3.
4.
5.
6.
with t as ( select * from #t )
   , l as ( select * from t order by i offset @q - 1 rows fetch first 1 rows only )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)
...
Рейтинг: 0 / 0
03.02.2022, 08:30
    #40131408
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222

Код: sql
1.
2.
3.
4.
5.
6.
with t as ( select * from #t )
   , l as ( select * from t order by i offset @q - 1 rows fetch first 1 rows only )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)



Код: plaintext
1.
2.
3.
4.
5.
6.
Сообщение 319, уровень 15, состояние 1, строка 85
Сообщение 2714, уровень 16, состояние 6, строка 8
В базе данных уже существует объект с именем "#t".
Сообщение 102, уровень 15, состояние 1, строка 86
Неправильный синтаксис около конструкции "offset".
Сообщение 153, уровень 15, состояние 2, строка 86
Недопустимое использование параметра first в инструкции FETCH.
...
Рейтинг: 0 / 0
03.02.2022, 08:33
    #40131409
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Не позорьтесь.
Код: 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.
create table #t (i int identity, n int, x tinyint)
go

insert into #t(n, x)
	values 
	(1, 1), (1, 2), (1, 3), 
	(2, 1), (2, 1), (2, 2), (2, 3),
	(3, 1), (3, 1), (3, 2), 
	(4, 1), (4, 1), (4, 2), (4, 2),
	(4, 3), (5, 1), (5, 2), 
	(6, 1), (6, 2), (6, 3), (6, 4),
	(7, 1), (7, 2), (7, 3),
	(3, 3), (3, 3), (3, 3), (3, 3),
	(8, 1), (8, 2), (8, 2),
	(9, 1), (4, 4), (4, 4),
	(11, 1), (11, 2), (11, 3),
	(12, 2), (4, 5), (4, 6),
	(10, 1), (10, 1), (10, 2), (10, 3),
	(4, 7), (4, 7), (4, 7), (4, 7)

select * from #t

declare @q int = 25;

with t as ( select * from #t )
   , l as ( select * from t order by i offset @q - 1 rows fetch first 1 rows only )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)
;

drop table #t
...
Рейтинг: 0 / 0
03.02.2022, 08:40
    #40131410
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222

Код: sql
1.
2.
3.
4.
5.
6.
7.
with t as ( select * from #t)
   , n as ( select top(@q) * from t order by i )
   , l as ( select top(1) * from n order by i desc )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)




Например, при q = 39 должно было закончится этой строкой, а у вас чуть дальше.
Да, к сожалению, я не программист. По крайней мере образование - музыкальный колледж )))) Но хоть мой код - г... Но результат правильный.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create table #t (i int identity, n int, x tinyint)
go

insert into #t(n, x)
	values 
	(1, 1), (1, 2), (1, 3), 
	(2, 1), (2, 1), (2, 2), (2, 3),
	(3, 1), (3, 1), (3, 2), 
	(4, 1), (4, 1), (4, 2), (null, null), (4, 2),
	(4, 3), (5, 1), (5, 2), (null, null),
	(6, 1), (6, 2), (6, 3), (6, 4),
	(7, 1), (7, 2), (7, 3),
	(3, 3), (3, 3), (3, 3), (3, 3),
	(8, 1), (8, 2), (8, 2),
	(9, 1), (4, 4), (4, 4),
	(11, 1), (11, 2), (11, 3),
	(12, 2), (4, 5), (4, 6),
	(10, 1), (10, 1), (10, 2), (10, 3),
	(4, 7), (4, 7), (4, 7), (4, 7)
...
Рейтинг: 0 / 0
03.02.2022, 08:43
    #40131411
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222,

Код: 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.
create table #t (i int identity, n int, x tinyint)
go

insert into #t(n, x)
	values 
	(1, 1), (1, 2), (1, 3), 
	(2, 1), (2, 1), (2, 2), (2, 3),
	(3, 1), (3, 1), (3, 2), 
	(4, 1), (4, 1), (4, 2), (null, null), (4, 2),
	(4, 3), (5, 1), (5, 2), (null, null),
	(6, 1), (6, 2), (6, 3), (6, 4),
	(7, 1), (7, 2), (7, 3),
	(3, 3), (3, 3), (3, 3), (3, 3),
	(8, 1), (8, 2), (8, 2),
	(9, 1), (4, 4), (4, 4),
	(11, 1), (11, 2), (11, 3),
	(12, 2), (4, 5), (4, 6),
	(10, 1), (10, 1), (10, 2), (10, 3),
	(4, 7), (4, 7), (4, 7), (4, 7)
 ;with t as ( select * from #t )
   , l as ( select * from t order by i offset @q - 1 rows fetch first 1 rows only )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)



Код: plaintext
1.
2.
3.
Сообщение 102, уровень 15, состояние 1, строка 94
Неправильный синтаксис около конструкции "offset".
Сообщение 153, уровень 15, состояние 2, строка 94
Недопустимое использование параметра first в инструкции FETCH.

Может я чего-то не понимаю...
...
Рейтинг: 0 / 0
03.02.2022, 08:50
    #40131412
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Julia2000
aleks222

Код: sql
1.
2.
3.
4.
5.
6.
7.
with t as ( select * from #t)
   , n as ( select top(@q) * from t order by i )
   , l as ( select top(1) * from n order by i desc )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)




Например, при q = 39 должно было закончится этой строкой, а у вас чуть дальше.
Да, к сожалению, я не программист. По крайней мере образование - музыкальный колледж )))) Но хоть мой код - г... Но результат правильный.


У вас еще таинственным образом x участвует.
Обобщение на такой случай - задача для младшей ясельной группы.

Но вашему словесному описанию задачи результат соответствует: "но до тех пор, пока n не изменится".

Рекламация не принимается.
Учитесь не только играть, но делать это внятно.
...
Рейтинг: 0 / 0
03.02.2022, 08:52
    #40131413
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
Julia2000
aleks222,

Код: 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.
create table #t (i int identity, n int, x tinyint)
go

insert into #t(n, x)
	values 
	(1, 1), (1, 2), (1, 3), 
	(2, 1), (2, 1), (2, 2), (2, 3),
	(3, 1), (3, 1), (3, 2), 
	(4, 1), (4, 1), (4, 2), (null, null), (4, 2),
	(4, 3), (5, 1), (5, 2), (null, null),
	(6, 1), (6, 2), (6, 3), (6, 4),
	(7, 1), (7, 2), (7, 3),
	(3, 3), (3, 3), (3, 3), (3, 3),
	(8, 1), (8, 2), (8, 2),
	(9, 1), (4, 4), (4, 4),
	(11, 1), (11, 2), (11, 3),
	(12, 2), (4, 5), (4, 6),
	(10, 1), (10, 1), (10, 2), (10, 3),
	(4, 7), (4, 7), (4, 7), (4, 7)
 ;with t as ( select * from #t )
   , l as ( select * from t order by i offset @q - 1 rows fetch first 1 rows only )
   , i as ( select i = max(t.i) from t inner join l on t.i >= l.i and t.n = l.n 
              and not exists( select * from t as t1 where t1.i between l.i and t.i and t1.n <> t.n ) 
          )
 select * from t where i <= (select i from i)



Код: plaintext
1.
2.
3.
Сообщение 102, уровень 15, состояние 1, строка 94
Неправильный синтаксис около конструкции "offset".
Сообщение 153, уровень 15, состояние 2, строка 94
Недопустимое использование параметра first в инструкции FETCH.

Может я чего-то не понимаю...

У вас что древнее из MS SQL.
Там этого синтаксиса нет.
...
Рейтинг: 0 / 0
03.02.2022, 08:52
    #40131414
Julia2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбрать N+ количество строк (пока значение не изменилось)
aleks222
Julia2000
пропущено...


Например, при q = 39 должно было закончится этой строкой, а у вас чуть дальше.
Да, к сожалению, я не программист. По крайней мере образование - музыкальный колледж )))) Но хоть мой код - г... Но результат правильный.


У вас еще таинственным образом x участвует.
Обобщение на такой случай - задача для младшей ясельной группы.

Но вашему словесному описанию задачи результат соответствует: "но до тех пор, пока n не изменится".

Рекламация не принимается.
Учитесь не только играть, но делать это внятно.


x - здесь вообще можно убрать, он вообще никак не участвует. Он необходим в следующей части задачи, которая здесь никак не затрагивается. Просто я в своем тестовом примере его изначально включила...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выбрать N+ количество строк (пока значение не изменилось) / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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