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

Код: 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
выбрать N+ количество строк (пока значение не изменилось)
    #40128797
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разучить RANK() over().

Или

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

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


	select* from #t
	where n<=(select n from #t where i=@c)
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40128832
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40128862
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Чем тебе ties не угодили?
Julia2000
Порядок строк обеспечивает i.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40128919
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40129098
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 не выбирает.
Можно ли как-то проще это сделать?
Спасибо )
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40129113
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40129116
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin,

На MSSQL2008 это работает?
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40129150
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
выбрать N+ количество строк (пока значение не изменилось)
    #40129186
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
3unknown,

Спасибо!

Оказалось, что мой вариант в текущем виде неправильный.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40129192
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131132
ValK412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131406
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.
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131407
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)



Можно немножко прогрессивнее
Код: 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
выбрать N+ количество строк (пока значение не изменилось)
    #40131408
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131409
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.
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131410
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 должно было закончится этой строкой, а у вас чуть дальше.
Да, к сожалению, я не программист. По крайней мере образование - музыкальный колледж )))) Но хоть мой код - г... Но результат правильный.

Код: 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
выбрать N+ количество строк (пока значение не изменилось)
    #40131411
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.

Может я чего-то не понимаю...
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131412
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131413
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выбрать N+ количество строк (пока значение не изменилось)
    #40131414
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Julia2000
пропущено...


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


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

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

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


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


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