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

У вас что древнее из MS SQL.
Там этого синтаксиса нет.


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

У вас что древнее из MS SQL.
Там этого синтаксиса нет.


Извините, но что мне выдал сервер, то я вам и показала...
MSSQL2008


Извиняю, пользуйтесь ортодоксальным вариантом.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131417
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222


Извиняю, пользуйтесь ортодоксальным вариантом.


Чуть выше я вам показала, что он тоже дает неправильный результат.
22429400
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131418
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000
aleks222


Извиняю, пользуйтесь ортодоксальным вариантом.


Чуть выше я вам показала, что он тоже дает неправильный результат.
22429400


Чуть выше я вам растолковал, что "рояль в кустах не виден".
В вашем описании значение колонки X не указано.

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


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

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

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


x - здесь вообще можно убрать, он вообще никак не участвует. Он необходим в следующей части задачи, которая здесь никак не затрагивается. Просто я в своем тестовом примере его изначально включила...


Тогда все правильно.

i n x
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1
6 2 2
7 2 3
8 3 1
9 3 1
10 3 2
11 4 1
12 4 1
13 4 2
14 4 2
15 4 3
16 5 1
17 5 2
18 6 1
19 6 2
20 6 3
21 6 4
22 7 1
23 7 2
24 7 3
25 3 3
26 3 3
27 3 3
28 3 3
29 8 1
30 8 2
31 8 2
32 9 1
33 4 4
34 4 4
35 11 1
36 11 2
37 11 3
38 12 2
------------
39 4 5
40 4 6

------------------
41 10 1
42 10 1
43 10 2
44 10 3
45 4 7
46 4 7
47 4 7
48 4 7
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131432
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Честно, я верю, что вы профессионал и все прочее.
Но, возможно, я очень плохо объяснила условия задачи. Возможно, у вас просто плохое настроение.
Чуть выше я написала, что x вообще никак не участвует. И в моем варианте решения это видно.
Исходные данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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)

delete from #t where i = 47 or i = 12

select * from #t


Ваш вариант решения
Код: 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.
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.
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
			)
		when					---- если запрошенное количество строк больше, чем имеется
			(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 order by t.i desc) < @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
		)


результат при q=1 - все отлично
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
i                    n           x
-------------------- ----------- ---- мой
1                    1           1
2                    1           2
3                    1           3

(строк обработано: 3)



(строк обработано: 1)
i           n           x
----------- ----------- ---- ваш
1           1           1
2           1           2
3           1           3

(строк обработано: 3)


результат при q=13 (( у меня правильно, у вас неправильно
Код: 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.
(строк обработано: 1)
i                    n           x
-------------------- ----------- ---- мой
1                    1           1
2                    1           2
3                    1           3
4                    2           1
5                    2           1
6                    2           2
7                    2           3
8                    3           1
9                    3           1
10                   3           2
11                   4           1
12                   4           2
13                   4           2
14                   4           3

(строк обработано: 14)



(строк обработано: 1)
i           n           x
----------- ----------- ---- ваш

(строк обработано: 0)


результат при q=11, все отлично (лишнюю строку с null можно потом убрать)
Код: 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.
i                    n           x
-------------------- ----------- ---- мой
1                    1           1
2                    1           2
3                    1           3
4                    2           1
5                    2           1
6                    2           2
7                    2           3
8                    3           1
9                    3           1
10                   3           2
11                   4           1
12                   4           2
13                   4           2
14                   4           3

(строк обработано: 14)



(строк обработано: 1)
i           n           x
----------- ----------- ---- ваш
1           1           1
2           1           2
3           1           3
4           2           1
5           2           1
6           2           2
7           2           3
8           3           1
9           3           1
10          3           2
11          4           1
13          4           2
14          NULL        NULL
15          4           2
16          4           3

(строк обработано: 15)


результат при q=39, (( у меня правильно, у вас неправильно
Код: 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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
i                    n           x
-------------------- ----------- ---- мой
1                    1           1
2                    1           2
3                    1           3
4                    2           1
5                    2           1
6                    2           2
7                    2           3
8                    3           1
9                    3           1
10                   3           2
11                   4           1
12                   4           2
13                   4           2
14                   4           3
15                   5           1
16                   5           2
17                   6           1
18                   6           2
19                   6           3
20                   6           4
21                   7           1
22                   7           2
23                   7           3
24                   3           3
25                   3           3
26                   3           3
27                   3           3
28                   8           1
29                   8           2
30                   8           2
31                   9           1
32                   4           4
33                   4           4
34                   11          1
35                   11          2
36                   11          3
37                   12          2
38                   4           5
39                   4           6

(строк обработано: 39)



(строк обработано: 1)
i           n           x
----------- ----------- ---- ваш
1           1           1
2           1           2
3           1           3
4           2           1
5           2           1
6           2           2
7           2           3
8           3           1
9           3           1
10          3           2
11          4           1
13          4           2
14          NULL        NULL
15          4           2
16          4           3
17          5           1
18          5           2
19          NULL        NULL
20          6           1
21          6           2
22          6           3
23          6           4
24          7           1
25          7           2
26          7           3
27          3           3
28          3           3
29          3           3
30          3           3
31          8           1
32          8           2
33          8           2
34          9           1
35          4           4
36          4           4
37          11          1
38          11          2
39          11          3
40          12          2 ------- лишняя строка

(строк обработано: 39)


Возможно, и я даже в этом уверена, что мой код ужасно плохой, неоптимальный (говнокод), но он дает правильный результат. По-моему, это важнее для работы. Да, я прекрасно понимаю, что лучше, когда лучше (профессиональнее и прочее), но я не умею и поэтому посмела опубликовать здесь свое решение и, вдруг, у кого-то будет настроение/желание подсказать, объяснить... Но это не обязательно, это всего лишь личное желание. Фсе!

Код: sql
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


Вот это везде я написала исходя из моего уровня знаний. А именно, большой объем данных, индексы созданы по i и по n. Как я понимаю, что если я результат этого запроса положу во временную таблицу, то там уже, вроде , не работают индексы. Возможно, я не права. За одно я пронумеровала i, чтобы не было разрывов. Возможно, зря.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131441
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000
aleks222,
Честно, я верю, что вы профессионал и все прочее.
Но, возможно, я очень плохо объяснила условия задачи. Возможно, у вас просто плохое настроение.
Чуть выше я написала, что x вообще никак не участвует. И в моем варианте решения это видно.


Мадам, теперь объясните почему запись i = 40 не попадает в выборку @q = 39?

i n x
------------
39 4 5
40 4 6
------------------

Согласно техзаданию:

Julia2000

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


ЗЫ: А уж потом, я полезу разбираться в дебри вашего кода.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131447
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.
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)

delete from #t where i = 47 or i = 12

select * from #t

declare @q int = 39;

with t as ( select * from #t)
   select top(@q) * from t order by i 
;



А еще уверяют, что музыка сродни математике...
Врут-сЪ.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131448
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Наверное, потому что у меня есть там - row_number() over(order by ts.i). Я i переделала нумерацию сначала, чтобы избавится от возможных дыр в нумерации. Возможно, я это зря сделала, но меня (заказчика) эта часть полностью устраивает.
То есть, еще раз цель, мне необходимо выбрать сколько-то строк сначала (начало/последовательность определяется по i), но с условием, пока n не изменилось их также включить в выборку, все это согласно последовательности по i.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131449
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222


А еще уверяют, что музыка сродни математике...
Врут-сЪ.


С этим абсолютно согласна! Мне никогда не давалась математика, а с музыкой все прекрасно ))
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131454
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
39 первых строк.
i n x
1 1 1
2 1 2
3 1 3
4 2 1
5 2 1
6 2 2
7 2 3
8 3 1
9 3 1
10 3 2
11 4 1
13 4 2
14 NULL NULL
15 4 2
16 4 3
17 5 1
18 5 2
19 NULL NULL
20 6 1
21 6 2
22 6 3
23 6 4
24 7 1
25 7 2
26 7 3
27 3 3
28 3 3
29 3 3
30 3 3
31 8 1
32 8 2
33 8 2
34 9 1
35 4 4
36 4 4
37 11 1
38 11 2
39 11 3
40 12 2

Теперь "по-слогам": чего в них неправильного?

ЗЫ. Я конечно понимаю, что именно.
ФОРМАЛЬНО - все по техзаданию.
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131455
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
;with t as ( select * from #t where n is not null )
   , 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)
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131470
Julia2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Код: sql
1.
2.
3.
4.
5.
6.
7.
;with t as ( select * from #t where n is not null )
   , 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)


К этому претензий вообще нет! Видимо, не хватало - where n is not null ) Спасибо!

Хотя для меня вообще непонятно %) Но это уже мои проблемы...
...
Рейтинг: 0 / 0
выбрать N+ количество строк (пока значение не изменилось)
    #40131477
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Julia2000
aleks222
Код: sql
1.
2.
3.
4.
5.
6.
7.
;with t as ( select * from #t where n is not null )
   , 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)


К этому претензий вообще нет! Видимо, не хватало - where n is not null ) Спасибо!

Хотя для меня вообще непонятно %) Но это уже мои проблемы...


Разруха не в сортирах, разруха в головах.

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


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