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

Откуда: Пермь
Сообщений: 57
Доброго времени суток!
Имеется таблица в которой есть пересекающиеся значения:

Начало Конец знач1знач2знач3знач4знач5знач6
37.50638.5986
37.50638.47568
38.47538.7711312
38.593996
38.77139.1951017
3940.7115
39.19539.585630
39.58539.6591014
39.65940.98912
41.4342.353
41.6942.20937
42.20942.3714


Нужно их объединить таким образом чтобы не было накладывающихся значений (начало,конец)

Пример:
Начало Конец знач1знач2знач3знач4знач5знач6
37.50638.4756886
38.47538.59131286
38.5938.771131296
38.77139101796
3939.1951017115
........................

Заранее благодарен!
24 сен 13, 14:09    [14877431]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
постройте уникальные начало - концы ..т.е. пересечение всех значений (без дубликатов) и сджойните их с таблицей..только непонятно что делать если будут 2 значения - их сумировать или как ?
24 сен 13, 14:13    [14877451]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
ArtyLyght
Member

Откуда: Пермь
Сообщений: 57
Maxx
постройте уникальные начало - концы ..т.е. пересечение всех значений (без дубликатов) и сджойните их с таблицей..только непонятно что делать если будут 2 значения - их сумировать или как ?

думаю что да нужно суммировать, а поподробней о способе описанным вами выше, не могли бы рассказать?
24 сен 13, 14:18    [14877476]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да шо там рассказывать то, по порядку во временую таблицу сгоняете все концы и начала, уберает дубликаты,сортируете по убыванию - получаеться цепочка значений которые у вас есть (нумеруете набор).
Патом джойните со своей таблицей начиная со строчек с номер 1 и 2 , еде 1 начало ,2 конец..и так делаее , колонки складываете через иснулл. реализуеться через рекурсирнове сте.
24 сен 13, 14:29    [14877540]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
ArtyLyght
Member

Откуда: Пермь
Сообщений: 57
Maxx
колонки складываете через иснулл. реализуеться через рекурсирнове сте.

Можно про этот момент поподробней
24 сен 13, 14:34    [14877572]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
может тут подчерпнете идеи
24 сен 13, 15:03    [14877787]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Если у вас диапазоны последовательные,то мона где то так
declare @t table (b float ,e float,  a int, c int , d int)
insert into @t(b,e,a,c,d)
values (38.1,38.2, 0,1,2), (38.2, 38.3, 0,0,4), (38.3, 39.6, 2,0,0)
declare @t1 table (x float, i int)
insert into @t1 (x, i)
select
    x.x
   ,i = row_number() over(order by x.x asc) 
from (
   select distinct x = b
   from @t
   union
   select distinct x = t.e
   from @t t

   ) x

--select * from @t
--select * from @t1
; with cte as (
   select 
      b = t1.b 
	  ,e = t3.e
	  ,a = ISNULL(t1.a,0) +ISNULL(t3.a, 0)
	  ,d = ISNULL(t1.d,0) +ISNULL(t3.d, 0)
	  ,c = ISNULL(t1.c,0) +ISNULL(t3.c, 0)
	  ,n =1
   from @t t1
     inner join @t1 t2 on t1.b = t2.x and t2.i =1
	 inner join @t1 t4 on t2.i +1 = t4.i
	 inner join @t t3 on t3.e =t4.x  
  union all
  select
       b = t1.b 
	  ,e = t3.e
	  ,a = ISNULL(t1.a,0) +ISNULL(t3.a, 0)
	  ,d = ISNULL(t1.d,0) +ISNULL(t3.d, 0)
	  ,c = ISNULL(t1.c,0) +ISNULL(t3.c, 0)
	  ,n = n+1
  from @t t1
    inner join cte c on t1.b =c.e
	inner join @t1 t2 on c.n +2  = t2.i
	inner join @t t3 on t3.e =t2.x 

)
select * from cte

а если нет - то выберайте что вам ближе
24 сен 13, 15:34    [14878031]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
cupoftea111
Member

Откуда:
Сообщений: 4
with
d as
(
	select *
	from
	(
		values
		(37.506,38.59,null,cast(null as int),null,8,cast(null as int),6),
		(37.506,38.475,6,null,8,null,null,null),
		(38.475,38.771,13,null,12,null,null,null),
		(38.59,39,null,null,null,9,null,6),
		(38.771,39.195,10,null,17,null,null,null),
		(39,40.7,null,null,null,11,null,5),
		(39.195,39.585,6,null,30,null,null,null),
		(39.585,39.659,10,null,14,null,null,null),
		(39.659,40.98,9,null,12,null,null,null),
		(41.43,42.3,null,null,null,5,null,3),
		(41.69,42.209,3,null,7,null,null,null),
		(42.209,42.3,7,null,14,null,null,null)
	) t(Начало, Конец, знач1,знач2,знач3,знач4,знач5,знач6)
),
s1 as
(
	select Начало as V, +1 as Flag, знач1,знач2,знач3,знач4,знач5,знач6
	from d

	union all

	select Конец as V, -1 as Flag, знач1,знач2,знач3,знач4,знач5,знач6
	from d
)
select min(V) as Начало, max(V) as Конец,max(знач1) as знач1, max(знач2) as знач2, max(знач3) as знач3, max(знач4) as знач4, max(знач5) as знач5, max(знач6) as знач6
from
(
	select V, max(знач1) as знач1, max(знач2) as знач2, max(знач3) as знач3, max(знач4) as знач4, max(знач5) as знач5, max(знач6) as знач6, (row_number() over(order by V, Flag) + 1)/ 2 as g
	from s1
	group by V, Flag
) z
group by g
24 сен 13, 17:23    [14878876]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
+ create table #test
if object_id('tempdb..#test') is null begin
  create table #test (
    начало float,конец float,
    знач1 int,знач2 int,знач3 int,знач4 int,знач5 int,знач6 int
    )
  insert #test (начало,конец,знач1,знач2,знач3,знач4,знач5,знач6) values 
    (37.506,38.59,NULL,NULL,NULL,8,NULL,6),
    (37.506,38.475,6,NULL,8,NULL,NULL,NULL),
    (38.475,38.771,13,NULL,12,NULL,NULL,NULL),
    (38.59,39,NULL,NULL,NULL,9,NULL,6),
    (38.771,39.195,10,NULL,17,NULL,NULL,NULL),
    (39,40.7,NULL,NULL,NULL,11,NULL,5),
    (39.195,39.585,6,NULL,30,NULL,NULL,NULL),
    (39.585,39.659,10,NULL,14,NULL,NULL,NULL),
    (39.659,40.98,9,NULL,12,NULL,NULL,NULL),
    (41.43,42.3,NULL,NULL,NULL,5,NULL,3),
    (41.69,42.209,3,NULL,7,NULL,NULL,NULL),
    (42.209,42.3,7,NULL,14,NULL,NULL,NULL)
  select * from #test
end
;with CTE as (
  select точка, row_number() over (order by точка)rn 
  from (
    select начало точка from #test
    union all
    select конец точка from #test
    )u
  group by точка
  )
select 
  d.начало,d.конец,
  MIN(t.знач1)знач1,MIN(t.знач2)знач2,MIN(t.знач3)знач3,
  MIN(t.знач4)знач4,MIN(t.знач5)знач5,MIN(t.знач6)знач6
from #test t
join(
  select b.точка начало, e.точка конец
  from CTE b
  join CTE e on e.rn=b.rn+1
  )d on t.начало<=d.начало and d.конец<=t.конец
group by d.начало,d.конец
+ Итоги
началоконецзнач1знач2знач3знач4знач5знач6
37.50638.5986
37.50638.47568
38.47538.7711312
38.593996
38.77139.1951017
3940.7115
39.19539.585630
39.58539.6591014
39.65940.98912
41.4342.353
41.6942.20937
42.20942.3714

началоконецзнач1знач2знач3знач4знач5знач6
37.50638.4756886
38.47538.59131286
38.5938.771131296
38.77139101796
3939.1951017115
39.19539.585630115
39.58539.6591014115
39.65940.7912115
40.740.98912
41.4341.6953
41.6942.2093753
42.20942.371453
24 сен 13, 18:42    [14879306]     Ответить | Цитировать Сообщить модератору
 Re: объединение пересекающихся строк  [new]
ArtyLyght
Member

Откуда: Пермь
Сообщений: 57
Cygapb-007,
Большое спасибо! Все работает правильно, теперь осталось до конца понять как все работает )))
25 сен 13, 06:33    [14880336]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить