Помогите написать запрос!

RT+
Дата: 12.10.2003 14:33:12
create table t (m varchar(1), n int)
insert into t
select 'a', 1 union all
select 'a', 3 union all
select 'a', 4 union all
select 'a', 4 union all
select 'a', 5 union all
select 'a', 6 union all
select 'a', 6 union all
select 'a', 6 union all
select 'a', 8 union all
select 'a', 9 union all
select 'b', 1 union all
select 'b', 1 union all
select 'b', 2 union all
select 'b', 2 union all
select 'b', 5

Надо получить (т.е. для каждой группы по полю "m"
найти границы отрезков без разрывов по полю "n"):


m nMin nMax
-------- ----------- -----------

a 1 1
a 3 6
a 8 9
b 1 2
b 5 5
ququ
Дата: 12.10.2003 15:00:41
Вам нужен именно запрос?
По-моему курсором с order by m,n решается проще всего.
RT+
Дата: 12.10.2003 16:03:59
К сожалению, нужен именно запрос...
ququ
Дата: 12.10.2003 16:55:47
Может, в таком случае, Вам добавить "интеллекта" в Вашу таблицу? Например написать триггер(ы), что бы складывать в результирующую таблицу готовый результат, а оттуда доставать уже при помощи простого select m, nMin, nMax from ...
Ru
Дата: 12.10.2003 17:49:24
use tempdb

go
if object_id('t') is not null drop table t
go
create table t (m varchar(1), n int)
insert into t
select 'a', 1 union all
select 'a', 3 union all
select 'a', 4 union all
select 'a', 4 union all
select 'a', 5 union all
select 'a', 6 union all
select 'a', 6 union all
select 'a', 6 union all
select 'a', 8 union all
select 'a', 9 union all
select 'b', 1 union all
select 'b', 1 union all
select 'b', 2 union all
select 'b', 2 union all
select 'b', 5

declare @t2 table(m char(1),n int)
declare @t3 table(m char(1),n int)

insert @t2
select distinct t1.m,cast(dateadd(day,num,(select min(t.n)-1 from t where t.m=t1.m group by t.m)) as int) n
from
(select b*100+c*10+d num from
(select 0 b union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) b
cross join
(select 0 c union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) c
cross join
(select 0 d union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) d) a, t t1
where cast(dateadd(day,num,(select min(t.n)-1 from t where t.m=t1.m group by t.m)) as int)<=(select max(t.n)from t where t.m=t1.m group by t.m)
and cast(dateadd(day,num,(select min(t.n)-1 from t where t.m=t1.m group by t.m)) as int) not in (select t.n from t where t.m=t1.m)

insert @t3
select distinct t1.m,cast(dateadd(day,num,(select min(t.n) from t where t.m=t1.m group by t.m)) as int) n
from
(select b*100+c*10+d num from
(select 0 b union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) b
cross join
(select 0 c union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) c
cross join
(select 0 d union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) d) a, t t1
where cast(dateadd(day,num,(select min(t.n) from t where t.m=t1.m group by t.m)) as int)<=(select max(t.n)+1 from t where t.m=t1.m group by t.m)
and cast(dateadd(day,num,(select min(t.n) from t where t.m=t1.m group by t.m)) as int) not in (select t.n from t where t.m=t1.m)


select u.m,u.l nMin,min(v.r) nMax
from
(select t2.m, (select min(t.n) from t where t.n>t2.n and t.m=t2.m) l from @t2 t2) u,
(select t3.m, (select max(t.n) from t where t.n<t3.n and t.m=t3.m) r from @t3 t3) v
where u.l<=v.r and u.m=v.m
group by u.m,u.l
order by 1
go
(c)VIG
Дата: 12.10.2003 22:21:13
select b.m,min(b.n) min_n,b.max_n 

from
(
select t.m,t.n,
(select min(a.n)-1
from
(
select t.m,t.n+1 n
from t left join t t1 on t.m=t1.m and t.n+1=t1.n
where t1.m is null
) as a
where a.m=t.m and a.n>t.n) as max_n
from t
) as b
group by b.m,b.max_n
RT+
Дата: 12.10.2003 22:22:24
Ого!! Спасибо! Но может всё-таки как-нибудь попроще можно?
RT+
Дата: 12.10.2003 22:43:27
Мой предыдущий пост относился к мемберу Ru.

2 VIG
Мощно! Четыре селекта в одном запросе.
А тремя селектами могёшь сделать?
(и здесь остапа понесло...)
(c)VIG
Дата: 12.10.2003 23:41:04
2 RT+
Анекдот из далекого прошлого:
В обкоме партии спрашивают знатного дояра
-А 4000 л. молока сможешь надоить от одной коровы?
-Могу.
-А 5000?
-(немного задумавшись) Могу!
-Ну а 6000?
-Нет
-Почему?
-Слишком много воды будет
RT+
Дата: 13.10.2003 01:04:08
Я слышал, что эстонские коровы породы Glorii Nonvulgaris до
вторжения приносили по 8500 л. неразбавленного молока...
А вот мой вариант:


select m, min(n) nMin, max(n) nMax from
(select m, n,
n-(select count(distinct n) from t tt where tt.m=t.m and tt.n<t.n) e
from t) z
group by m, e