Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Я правильно понимаю, что сначала надо угадать, почему из исходных данных получился такой результат? |
30 авг 16, 16:54 [19608479] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
Прошу прощения, первоначально выглядит так: 1 2 3 4 5 7 8 9 10 Результат парсинга строки строки и проверки на не не нул значения, могут быть даты, но задача в итоге вывести отрезки 1 - 5 7-10 (в строку столбец не важно) |
30 авг 16, 17:09 [19608577] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
o-o, да! а реализация?? допустим CTE, но как задать условие что проверяем от сих до сих?? так как обще признаку разбить не получится, и это запрос! не в цикле |
30 авг 16, 17:14 [19608613] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Там, где нет предыдущего заначения = начало отрезка непрерывности. Там, где нет следующего занчения = конец отрезка непрерывности. Ну а отсортировать по-порядку - это ваще даже дурак может. |
||
30 авг 16, 17:24 [19608650] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
Спасибо всем! не додумал, а масса решений расширяет сознание) |
31 авг 16, 12:14 [19611481] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Это не решения - это бред. За использование группировки без нужды надо вешать за яйца. |
||
31 авг 16, 13:21 [19611974] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
Предложи свое |
31 авг 16, 13:55 [19612282] Ответить | Цитировать Сообщить модератору |
можна йа ? ))
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] Ответить | Цитировать Сообщить модератору |
туда же
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] Ответить | Цитировать Сообщить модератору |
кролик-зануда
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ты, наверное, думаешь что первый такой? Эта задача всплывает регулярно. Мне лень повторяться. Ищи и обрящешь. |
||
31 авг 16, 16:40 [19613348] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
Aleks2, Я думаю, что в любой ситуации нужно полагаться на факты. А у вас из фактов "каждый дурак сможет" и "мне лень". Изначально форум это место, где люди делятся опытом, а не бьют себе кулаком в грудь. |
31 авг 16, 17:03 [19613519] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ну давай я поищу за тебя... 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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
https://www.sql.ru/forum/afsearch.aspx?s=aleks2 ?????????????&submit=?????&bid=1 |
31 авг 16, 17:55 [19613809] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Пардон, фсе не то вставляю... https://www.sql.ru/forum/afsearch.aspx?s=?????????????&submit=?????&bid=1 |
31 авг 16, 17:58 [19613826] Ответить | Цитировать Сообщить модератору |
Павел Фурсов Member Откуда: Украина Сообщений: 111 |
Не удержался: 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] Ответить | Цитировать Сообщить модератору |
unikum
Guest |
aleks2, Видите, как легко помогать людям, теперь изучил все по теме непрерывность, и могу применять на практике для еще более сложных задач, при этом уже знаю как хорошо и как плохо. Спасибо. |
1 сен 16, 13:54 [19617240] Ответить | Цитировать Сообщить модератору |
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 | ![]() |