Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: помогите с подзапросом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3033
оно ?
, row_number() over(partition by id, value order by time) + row_number() over(partition by id order by time Desc) as grp
23 июл 12, 17:26    [12904292]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
temoxa
Member

Откуда:
Сообщений: 405
HandKot, респект!
огромное спасибо за помощь!
23 июл 12, 18:49    [12904793]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
temoxa
Member

Откуда:
Сообщений: 405
HandKot, извени за беспокойство! Но можно еще один вопрос?
Пробывал сделать чтобы максимальная дата первого состояния (например 0) было минимальной датой второго состояния (например 1) и наоборот! Пробывал делать как Добрый, но что-то не клееться! Это возможно реализовать? спасибо..
25 июл 12, 10:40    [12912224]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3033
и как пробовал?
25 июл 12, 10:41    [12912229]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
temoxa
Member

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

insert into @test(id, 
	time
	,value
)
values	(1, '20100101',1)
		,(1, '20100102',1)
		,(1, '20100103',2)
		,(2, '20100104',-1)
		,(2, '20100105',-1)
		,(2, '20100106',-1)
		,(3, '20100107',2)
		,(3,'20100108',2)
		,(3, '20100109',-1)
declare @value int 
set @value = 1	


;with
  x_test as
    (
      select id, value, time, case when value > 0 then 1 else 0 end as flag,
             row_number() over(partition by id, case when value > 0 then 1 else 0 end order by time) + row_number() over(partition by id order by time Desc) as rn1,
             row_number() over(partition by id order by time desc) as rn
        from @test
    )
--Select * From x_test

select min(t1.time), max(coalesce(t2.time, t1.time))
  from (select * from x_test where flag = 1) t1
  left join
       (select * from x_test where flag = 0) t2
    on t1.rn = t2.rn - 1
group by t1.rn - t1.rn1


Как-то так! Но получается бред...
25 июл 12, 11:18    [12912570]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
temoxa
Member

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

да и еще к тому этот вариант исключает одно из состояний в принципе!
это плохо...
25 июл 12, 11:53    [12912816]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
temoxa
Member

Откуда:
Сообщений: 405
HandKot, это возможно реализовать? или я просто трачу время?
25 июл 12, 12:56    [12913393]     Ответить | Цитировать Сообщить модератору
 Re: помогите с подзапросом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3033
так ?
declare @test table(id int, time datetime,value int)
insert into @test(id, 
	time
	,value
)
values	(1, '20100101',1)
		,(1, '20100102',1)
		,(1, '20100103',2)
		,(2, '20100104',-1)
		,(2, '20100105',-1)
		,(2, '20100106',-1)
		,(3, '20100107',2)
		,(3,'20100108',2)
		,(3, '20100109',-1)


;with
  x_test as
    (
      select 
			id
			, value
			, time
             , row_number() over(partition by id, value order by time) + row_number() over(partition by id order by time Desc) as grp
        from @test
    )
	, x_test1 as
	(
	select
		t1.id 
		, t1.value
		, min(t1.time) as min
		, max(t1.time) as max
		, ROW_NUMBER() over (Partition by t1.id order by  min(t1.time)) rn
	from 
		x_test t1
	group by
		t1.id, t1.value, t1.grp
	)
select
	x1.id
	, x1.value
	, x2.max
	, x1.max
from
	x_test1 x1
left join  x_test1 x2 on x2.id = x1.id and x2.rn = x1.rn - 1
order by 1, 3
25 июл 12, 18:42    [12915951]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить