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

Откуда: Москва
Сообщений: 84
Есть некая таблица:

namenum1num2
str112
str223
str356
str467


Какой конструкцией T-SQL можно выцепить разрыв между num2 предыдущей строки и num1 последующей строки?
То есть запрос должен возвращать датасет вида:

namenum1num2
str223
str356


Заранее спасибо!
8 авг 11, 10:16    [11083963]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
WadimX
Member

Откуда: Saint-Petersburg
Сообщений: 41
1. Что подразумевается под разрывом?
2. Для каких аргументов должен вернуться такой датасет?
8 авг 11, 10:45    [11084144]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
zondik, что-то типа такого?
DECLARE @tbl TABLE (name VARCHAR(10), num1 INT, num2 INT)

INSERT INTO @tbl(name, num1, num2)
SELECT 'str1', 1, 2  UNION ALL SELECT
'str2', 2, 3   UNION ALL SELECT
'str3', 5, 6   UNION ALL SELECT
'str4', 6, 7   UNION ALL SELECT
'str5', 10, 12


;WITH    cte
          AS ( SELECT   t.name,
                        t.num1,
                        t.num2,
                        ROW_NUMBER() OVER ( ORDER BY ( SELECT   1
                                                     ) ) rn
               FROM     @tbl t
             )
    SELECT  t1.name,
            t1.num1,
            t1.num2
    FROM    ( SELECT    t.name,
                        t.num1,
                        t.num2,
                        t.rn
              FROM      cte t
              LEFT JOIN @tbl t1
              ON        t.num1 = t1.num2
              WHERE     t.rn <> 1
                        AND t1.num1 IS NULL
            ) t
            JOIN cte t1 ON t.rn = t1.rn OR t.rn-1 = t1.rn
8 авг 11, 11:04    [11084283]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
_ч_
Member

Откуда:
Сообщений: 1446
zondik,

declare @t table(s nvarchar(10), num1 int, num2 int)
insert into @t
select 'str1',	1,	2
union select 'str2',	2,	3
union select 'str3',	5,	6
union select 'str4',	6,	7


declare @Test table(ID INT)
insert into @Test 
select distinct num1 from @t 
union
select distinct num2 from @t

select * from @t
where num1 in 
	(SELECT b.id FROM @test a
	LEFT JOIN @test b ON a.id<b.id
	LEFT JOIN @test c ON c.id> a.id AND c.id <b.id
	WHERE c.id IS NULL AND b.id -a.id >1)
or num2 in 
	(SELECT a.id FROM @test a
	LEFT JOIN @test b ON a.id<b.id
	LEFT JOIN @test c ON c.id> a.id AND c.id <b.id
	WHERE c.id IS NULL AND b.id -a.id >1)
8 авг 11, 11:10    [11084311]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
zondik
Member

Откуда: Москва
Сообщений: 84
kDnZP,
_ч_

Господа, огромное спасибо!
8 авг 11, 11:37    [11084523]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
zondik,

DECLARE @tbl TABLE (name VARCHAR(10), num1 INT, num2 INT)

INSERT INTO @tbl(name, num1, num2)
SELECT 'str1', 1, 2  UNION ALL SELECT
'str2', 2, 3   UNION ALL SELECT
'str3', 5, 6   UNION ALL SELECT
'str4', 6, 7   UNION ALL SELECT
'str5', 10, 12

select * from @tbl t
where not exists (select 1 from @tbl t1 where t.num2=t1.num1 or t.num1=t1.num2)
?
8 авг 11, 11:43    [11084558]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
Павел Воронцов,

точнее так
select * from @tbl t
where not exists (select 1 from @tbl t1 where t.num2=t1.num1
) 
or
 not exists (select 1 from @tbl t1 where t.num1=t1.num2
)
либо постановку проясните.
8 авг 11, 12:01    [11084700]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
_ч_
Member

Откуда:
Сообщений: 1446
kDnZP,

Ваш запрос выдает не совсем корректные данные на вот такой вот выборке:

select 'str1',	1,	2
union select 'str2',	2,	3
union select 'str3',	5,	6
union select 'str4',	6,	7
union select 'str5',	79637,	79638
union select 'str6',	79639,	79640
union select 'str7',	79640,	79641
union select 'str8',	79641,	79642

Выдает:

name num1 num2
---------- ----------- -----------
str2 2 3
str3 5 6
str4 6 7
str5 79637 79638
str5 79637 79638
str6 79639 79640
8 авг 11, 13:15    [11085343]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
_ч_
Member

Откуда:
Сообщений: 1446
_ч_
zondik,

declare @t table(s nvarchar(10), num1 int, num2 int)
insert into @t
select 'str1',	1,	2
union select 'str2',	2,	3
union select 'str3',	5,	6
union select 'str4',	6,	7


declare @Test table(ID INT)
insert into @Test 
select distinct num1 from @t 
union
select distinct num2 from @t

select * from @t
where num1 in 
	(SELECT b.id FROM @test a
	LEFT JOIN @test b ON a.id<b.id
	LEFT JOIN @test c ON c.id> a.id AND c.id <b.id
	WHERE c.id IS NULL AND b.id -a.id >1)
or num2 in 
	(SELECT a.id FROM @test a
	LEFT JOIN @test b ON a.id<b.id
	LEFT JOIN @test c ON c.id> a.id AND c.id <b.id
	WHERE c.id IS NULL AND b.id -a.id >1)


Так будет быстрее:
declare @t table(s nvarchar(10), num1 int, num2 int)
insert into @t
select 'str1',	1,	2
union select 'str2',	2,	3
union select 'str3',	5,	6
union select 'str4',	6,	7

CREATE TABLE #Test(ID INT PRIMARY KEY)
insert into #Test 
select distinct num1 from @t 
union
select distinct num2 from @t

select * from @t
where num1 in 
	(select T3.N2
	from (select T1.ID, (select min(ID) from #Test where ID > T1.ID) as N2
			from #Test T1) T3
	where T3.N2 - T3.ID > 1)
or num2 in 
	(select T3.ID
	from (select T1.ID, (select min(ID) from #Test where ID > T1.ID) as N2
			from #Test T1) T3
	where T3.N2 - T3.ID > 1)
	
DROP TABLE #Test
8 авг 11, 13:28    [11085416]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
_ч_
kDnZP,

Ваш запрос выдает не совсем корректные данные на вот такой вот выборке:

select 'str1',	1,	2
union select 'str2',	2,	3
union select 'str3',	5,	6
union select 'str4',	6,	7
union select 'str5',	79637,	79638
union select 'str6',	79639,	79640
union select 'str7',	79640,	79641
union select 'str8',	79641,	79642

Выдает:

name num1 num2
---------- ----------- -----------
str2 2 3
str3 5 6

str4 6 7
str5 79637 79638

str5 79637 79638
str6 79639 79640



Я не знаю, какие должны быть корректные (т.е. обратите внимание что нумерацию делаю отфонарную, что не совсем есть верно и требует уточнения), но в любом случае. Пример с вашей выборкой показывает, что вродь все нормально...

Сделал отступы для наглядности.
8 авг 11, 13:43    [11085513]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
_ч_, или вас смущает задвоение str5? Ну это так типа и было задумано, хотя DISTINCT никто не отменял, если что...
8 авг 11, 13:48    [11085560]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
_ч_
Member

Откуда:
Сообщений: 1446
kDnZP,

да, все верно, это я проглядел
8 авг 11, 13:50    [11085574]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по T-SQL  [new]
_ч_
Member

Откуда:
Сообщений: 1446
kDnZP,

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

str1       1           2
str2       2           3
strn       3           4
str3       5           6

будет ли считаться это "разрывом"?
Вот отсюда и путаница, поэтому я и ошибочно написал про некорректные значения в вашем запросе.
8 авг 11, 14:13    [11085763]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить