Вопрос про запрос

Alxs
Дата: 16.10.2003 15:57:00
Плс помогите:
есть табличка Readings:
Date - время считования данных,
Status - int

Date Status
------------------------
10.01.02 10:00 1
10.01.02 10:01 1
10.01.02 10:02 1
10.01.02 10:03 1
10.01.02 10:04 0
10.01.02 10:05 0
10.01.02 10:06 0
10.01.02 10:07 2
10.01.02 10:08 2
10.01.02 10:09 0
10.01.02 10:10 0
10.01.02 10:11 3

надо получить

Date Status
------------------------
10.01.02 10:00 1
10.01.02 10:01 1
10.01.02 10:02 1
10.01.02 10:03 1
<NULL> 0
10.01.02 10:07 2
10.01.02 10:08 2
<NULL> 0
10.01.02 10:11 3


т.е. группа строк со статусом 0 замещаются на <NULL> 0, с сохранением
порядка.
Berg
Дата: 16.10.2003 16:00:57
Это невозможно...Ты хочешь "иметь порядок в беспорядке"...:-)

Чтобы иметь возможность упорядочивания, тебе нужен столбец с данными о времени.

Чем тебе NULL поможет? Добавь еще столбец для своих целей, а этот оставь для ORDER BY.
iSestrin
Дата: 16.10.2003 16:01:22
select case when Status =0 then null else Date end, Status
...
order by Date
iSestrin
Дата: 16.10.2003 16:04:42
а, ну да, надо же еще группировать...


select d, status from
(select top 100 petcent case when Status =0 then null else Date end d, Status
...
order by Date) a
group by d, status


если конечно даты уникальные, иначе курсор поможет, а без него пока не придумалось
Павел Воронцов
Дата: 16.10.2003 16:05:48

select distinct nd, status
from (select Date, case status when 0 then null else Date end as nd, Status
from tbl) t
order by Date
Alxs
Дата: 16.10.2003 16:08:05
To:
iSestrin

select d, status from
(select top 100 petcent case when Status =0 then null else Date end d, Status
...
order by Date) a
group by d, status

Спасибо, но насколько быстро работает Case?
iSestrin
Дата: 16.10.2003 16:20:46
быстро:))

но вот есть ощущение, что поставленную задачу не решает ни один вариант...
Павел Воронцов
Дата: 16.10.2003 16:59:25
iSisterin прав. Вот так правильно:
declare @t table (d datetime not null, status smallint not null)


insert into @t values (dateadd(mi,-1,getdate()), 0)
insert into @t values (getdate(), 1)
insert into @t values (dateadd(mi,1,getdate()), 1)
insert into @t values (dateadd(mi,2,getdate()), 1)
insert into @t values (dateadd(mi,3,getdate()), 2)
insert into @t values (dateadd(mi,4,getdate()), 0)
insert into @t values (dateadd(mi,5,getdate()), 2)
insert into @t values (dateadd(mi,6,getdate()), 0)
insert into @t values (dateadd(mi,7,getdate()), 0)
insert into @t values (dateadd(mi,8,getdate()), 1)
insert into @t values (dateadd(mi,9,getdate()), 1)
insert into @t values (dateadd(mi,10,getdate()), 3)

select * from @t

select case t1.status when 0 then null else t1.d end as nd, t1.status
from @t t1
where t1.status > 0 or
0 < isnull((select max(t2.status) from @t t2
where t2.d = (select max(t3.d)
from @t t3
where t3.d < t1.d))
,1)
order by t1.d

Alxs
Дата: 16.10.2003 17:34:16
Павел Воронцов
Спасибо.