Можно ли осилить одним селектом? (или help)

Uncle Tola
Дата: 05.12.2012 16:39:37
Есть таблица:

With data as (
Select 1 as groupid, 34 as value, 1 as ord from dual
Union all
Select 1 as groupid, 43 as value, 2 as ord from dual
Union all
Select 1 as groupid, 31 as value, 3 as ord from dual
Union all
Select 1 as groupid, 42 as value, 4 as ord from dual
Union all
Select 1 as groupid, 55 as value, 5 as ord from dual
Union all
Select 1 as groupid, 700 as value, 6 as ord from dual
Union all
Select 1 as groupid, 6 as value, 7 as ord from dual
Union all
Select 2 as groupid, 85 as value, 1 as ord from dual
Union all
Select 2 as groupid, 43 as value, 2 as ord from dual
Union all
Select 2 as groupid, 95 as value, 3 as ord from dual
Union all
Select 3 as groupid, 195 as value, 1 as ord from dual
)
Select * from data


GROUPID VALUE ORD
1341
1432
1313
1424
1555
17006
167
2851
2432
2953
31951


ord - order, то есть порядок сортировки.

Как можно одним селектом вытащить цифры в одной группе идущие по порядку по возрастанию, причем возрастать должны минимум 3 числа в поле VALUE?
То есть в результате должно получиться

GROUPID VALUE ORD
1313
1424
1555
17006


[b][/b]
Ramin Hashimzade
Дата: 05.12.2012 16:45:52
и почему оно не включен в результат? 43-34=9 и 9>3

GROUPID VALUE ORD
1341
1432
Uncle Tola
Дата: 05.12.2012 16:47:31
Ramin,

Потому что только 2 числа возрастают.
Минимум 3 должно быть.
init.ora
Дата: 05.12.2012 17:07:59
with x as(
select g,val,ord ...
)

select g,val,ord
from(
	select g,val,ord,stat,s,count(*)over(partition by g,ord-s)cnt
	from(
		select g,val,ord,stat,row_number()over(partition by g,stat order by ord) s
		from(
			select g,val,lval,ord,
			case when val>=lval then 0 else 1 end stat
			from(
				select g,val,lead(val)over(partition by g order by ord) lval,ord
			)z
		)z
	)z
	where stat<>0
)z
where cnt>=3


что-то типа этого.
оракла нет под рукой, проверить не могу.
но решение будет похоже на это
init.ora
Дата: 05.12.2012 17:11:08
лучше не Lead а lag
Ramin Hashimzade
Дата: 05.12.2012 17:13:02
Uncle Tola
Ramin,

Потому что только 2 числа возрастают.
Минимум 3 должно быть.

честно не понял...
Uncle Tola
Дата: 05.12.2012 17:16:59
init.ora,

Последнее значение, 700 которое, не попадает.
init.ora
Дата: 05.12.2012 17:30:21
предлагаю подумать самому
и включить в решение
Lead И Lag одновременно.
суть в том чтобы найти флаг начала "возрастающей группы(0 и 1)"
init.ora
Дата: 05.12.2012 17:47:53
with x as(
select g,val,ord ...
)

select g,val,ord
from(
	select g,val,ord,count(*)over(partition by g, s)cnt
	from(
		select g,val,ord,sum(s)over(partition by g order by ord) s
		from(
			select g,val,lval,ord,
			case when val<=lval then 1 else 0 end s
			from(
				select g,val,lag(val)over(partition by g order by ord) lval,ord
			)z
		)z
	)z
)z
where cnt>=3


предыдущий пример плохой, этот получше, мне кажетсЯ
init.ora
Дата: 05.12.2012 17:48:30
НУ и форматирование в notepad++
здоровые отступы какие