Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос по иерархии  [new]
unikum
Guest
Добрый день,

результат сложного запроса:
1 2
2 3
4 5
7 8
8 9
9 10

Далее надо раскрутить на отрезки, т.е результат должен быть

1 3 4 5 7 10

В голову уже ничего не приходит, т.к общего признака нет и ввести его до не получается

Кто - нибудь сталкивался??
30 авг 16, 16:47    [19608416]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
Я правильно понимаю, что сначала надо угадать, почему из исходных данных получился такой результат?
30 авг 16, 16:54    [19608479]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
o-o
Guest
ну там же пути прописаны, из колонки 1 в колонку 2 есть путь.
надо собрать все маскимальные пути.
вот так идем и собираем: 1 попадает в 2, 2 в 3, из 3 никуда, ответ: 1 3
4 только в 5, ответ 4 5
7 в 8, 8 в 9, 9 в 10, ответ 7 10
теперь все вместе, 1 3 4 5 7 10
30 авг 16, 17:05    [19608551]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
Прошу прощения,
первоначально выглядит так:
1
2
3
4
5
7
8
9
10

Результат парсинга строки строки и проверки на не не нул значения,
могут быть даты, но задача в итоге вывести отрезки

1 - 5
7-10
(в строку столбец не важно)
30 авг 16, 17:09    [19608577]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
o-o,

да! а реализация?? допустим CTE, но как задать условие что проверяем от сих до сих??

так как обще признаку разбить не получится, и это запрос! не в цикле
30 авг 16, 17:14    [19608613]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
unikum
o-o,

да! а реализация?? допустим CTE, но как задать условие что проверяем от сих до сих??

так как обще признаку разбить не получится, и это запрос! не в цикле


Там, где нет предыдущего заначения = начало отрезка непрерывности.
Там, где нет следующего занчения = конец отрезка непрерывности.

Ну а отсортировать по-порядку - это ваще даже дурак может.
30 авг 16, 17:24    [19608650]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
declare @a table (ID int, Parent_ID int)
	

insert into @a
values
	(1, 2	),
	(2, 3	),
	(3, 4	),
	(4, 5	),
	(7, 8	),
	(8, 9	),
	(9, 10	)

select * from @a	

;with cte
as
(
	select
		Start_ID = ID,
		ID, 
		Parent_ID, 
		Level = 1 
	from @a
	where ID not in (select Parent_ID from @a)

	union all

	select 
		Start_ID = cte.Start_ID, 
		a.ID, 
		a.Parent_ID, 
		Level = cte.Level + 1
	from 
		cte
		inner join @a a on a.ID = cte.Parent_ID

)

select 
	s = min(ID), e = max(Parent_ID) 
from cte 
group by Start_ID
order by 1
30 авг 16, 17:30    [19608663]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
declare @a table (ID int, Parent_ID int)
	

insert into @a
values
	(1, 2	),
	(2, 3	),
	(3, 4	),
	(4, 5	),
	(7, 8	),
	(8, 9	),
	(9, 10	)

select * from @a	


;with cte
as
(
	select 
		RN = ROW_NUMBER() over (order by a.ID),
		a.*
	from @a	a
	left join @a _prev on _prev.ID  = a.ID - 1
	left join @a _next on _next.ID = a.ID + 1
	where _prev.ID is null or  _next.ID is null 
)


select 
	s = min(ID), e = max(Parent_ID) 
from cte
group by RN / 3
30 авг 16, 18:02    [19608819]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @num table(a int,b int)

insert @num 
values
	(1, 2	),
	(2, 3	),
	(3, 4	),
	(4, 5	),
	(7, 8	),
	(8, 9	),
	(9, 10	)

select min(a) a,max(b) b
from(
select *
,sum(n) over(order by a) s
from(
select a,b
,case when isnull(lag(b) over(order by a),a)=a or isnull(lag(a) over(order by a),a)=b  then 0 else 1 end n
from @num
) w
) z
group by s
30 авг 16, 19:56    [19609177]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
Mairos
Member

Откуда:
Сообщений: 555
unikum, я где-то тут на форуме видел похожее на...

declare @num table(a int,b int)

insert @num 
values
	(1, 2	),
	(2, 3	),
	(3, 4	),
	(4, 5	),
	(7, 8	),
	(8, 9	),
	(9, 10	)

select a, min(b) 
from
(
select a from @num t1 where not exists (select 1 from @num t2 where  t1.a > t2.a and t1.a <= t2.b)
) n
join
(
select b from @num t1 where not exists (select 1 from @num t2 where t1.b >= t2.a and t1.b < t2.b)
) e
on n.a < e.b
group by  n.a
31 авг 16, 12:03    [19611414]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
Спасибо всем! не додумал, а масса решений расширяет сознание)
31 авг 16, 12:14    [19611481]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
unikum
Спасибо всем! не додумал, а масса решений расширяет сознание)

Это не решения - это бред.
За использование группировки без нужды надо вешать за яйца.
31 авг 16, 13:21    [19611974]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
Предложи свое
31 авг 16, 13:55    [19612282]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
можна йа ? ))
Guest
declare @a table (ID int, Parent_ID int)
	

insert into @a
values
	(1, 2	),
	(2, 3	),
	(3, 4	),
	(4, 5	),
	(7, 8	),
	(8, 9	),
	(9, 10	)



select 
		a.ID
		,b.Parent_ID
from	

	(select 
			a1.ID
			,rn		=row_number()over(order by a1.ID)
	from		@a a1 
	left join	@a a2	on	a1.ID=a2.Parent_ID 
	where a2.ID is null) a 

inner join

	(select 
			a1.Parent_ID
			,rn		=row_number()over(order by a1.Parent_ID)
	from		@a a1 
	left join	@a a2	on	a1.Parent_ID=a2.ID 
	where a2.ID is null) b
	
on	a.rn=b.rn
31 авг 16, 15:06    [19612708]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
туда же
Guest
select
		ID			=max(ID)
		,Parent_ID	=max(Parent_ID) 
from
	(select 
			a1.ID
			,a2.Parent_ID
			,i		=row_number()over(partition by case when a1.ID is null then 0 when a2.Parent_ID is null then 1 end order by isnull(a1.ID,a2.Parent_ID))
	from		@a a1 
	full join	@a a2	on	a1.ID=a2.Parent_ID 

	where a1.ID is null or a2.Parent_ID is null) t

group by 
		i
31 авг 16, 15:42    [19612984]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
кролик-зануда
Guest
чот какт сложно всё

select MIN(id),MAX(parent_id)
  from(
select *,id-ROW_NUMBER()over(order by id)r
  from @a) a
 group by r 
31 авг 16, 15:48    [19613026]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
unikum
Предложи свое

Ты, наверное, думаешь что первый такой?
Эта задача всплывает регулярно.
Мне лень повторяться.
Ищи и обрящешь.
31 авг 16, 16:40    [19613348]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
Aleks2,

Я думаю, что в любой ситуации нужно полагаться на факты.

А у вас из фактов "каждый дурак сможет" и "мне лень".

Изначально форум это место, где люди делятся опытом, а не бьют себе кулаком в грудь.
31 авг 16, 17:03    [19613519]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
unikum
Aleks2,

Я думаю, что в любой ситуации нужно полагаться на факты.

А у вас из фактов "каждый дурак сможет" и "мне лень".

Изначально форум это место, где люди делятся опытом, а не бьют себе кулаком в грудь.


Ну давай я поищу за тебя...

https://www.sql.ru/forum/afsearch.aspx?s=aleks2 ?????????????&submit=?????&bid=1

https://www.sql.ru/forum/afsearch.aspx?s=aleks2 ?????????????&submit=?????&bid=1
31 авг 16, 17:51    [19613780]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
https://www.sql.ru/forum/afsearch.aspx?s=aleks2 ?????????????&submit=?????&bid=1
31 авг 16, 17:55    [19613809]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
aleks2
Guest
Пардон, фсе не то вставляю...
https://www.sql.ru/forum/afsearch.aspx?s=?????????????&submit=?????&bid=1
31 авг 16, 17:58    [19613826]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
Павел Фурсов
Member

Откуда: Украина
Сообщений: 111
unikum
Прошу прощения,
первоначально выглядит так:
1
2
3
4
5
7
8
9
10

Результат парсинга строки строки и проверки на не не нул значения,
могут быть даты, но задача в итоге вывести отрезки

1 - 5
7-10
(в строку столбец не важно)

Не удержался:
create table #t (
	id int primary key,
	rn int not null identity(1,1),
	unique (rn)
);

insert	#t (id)
select
	id
from	(
	values
		(1),
		(2),
		(3),
		(4),
		(5),
		(7),
		(8),
		(9),
		(10)
) a(id)
order by
	id;

; with
cte
as
(
	select
		id,
		_begin = id,
		_end = id,
		rn
	from	#t
	where
		rn = 1

	union all

	select
		n.id,
		_begin = case when n.id - p._end > 1 then n.id else p._begin end,
		_end = n.id,
		n.rn
	from	cte p
	join	#t n on p.rn + 1 = n.rn
)
/*select	*
from	cte*/
select
	_begin,
	max(_end) as _end
from	cte
group by
	_begin;

drop table #t
go
31 авг 16, 20:54    [19614470]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
unikum
Guest
aleks2,

Видите, как легко помогать людям, теперь изучил все по теме непрерывность, и могу применять на практике для еще более сложных задач, при этом уже знаю как хорошо и как плохо.

Спасибо.
1 сен 16, 13:54    [19617240]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по иерархии  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Предложу свой вариант:

declare @t table (i int);
insert into @t(i) values (1),(2),(3),(4),(5),(7),(8),(9),(10);

select b, e
from (select b, lead(b,1,0) over (order by b) as e, p
      from (select i as b, lag(i,1,i) over (order by i)+1-i as p, lead(i,1,i) over (order by i)-1-i as n 
            from @t
           ) t
      where not (n=0 and p=0) 
     ) t
where e!=0
and p!=0;
6 сен 16, 09:43    [19631488]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить