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

siriusP
Дата: 30.11.2009 16:36:25
Добрый день!
Помогите, пожалуйста, написать 2 запросa!
Есть таблица create table T (id number, name varchar2(50));

В поле id хранится порядковый номер записи, в name - имя, например:
1 'name1'
2 'name2'
3 'name3'
4 'name4'
5 'name5'

В результате первого запроса, должно получится (диапазон id с шагом 2):
1-2
3-4
5-5

В результате второго запроса, должно получится (значения name в диапазонах с шагом id=2):
1-2 'name1'
1-2 'name2'
3-4 'name3'
3-4 'name4'
5-5 'name5'

Возможно ли это написать без создания дополнительных массивов? Если да, буду рад помощи.
Спасибо.
4ton
Дата: 30.11.2009 16:52:53
siriusP,

Первый запрос

with t as
(select 1 id, 'name1' name from dual
union all
select 2, 'name2' from dual
union all
select 3, 'name3' from dual
union all
select 4, 'name4' from dual
union all
select 5, 'name5' from dual
)
select id||'-'||nvl(idrange,id) from
(select id,lead(id) over(order by id) idrange from t)
where mod(id,2)=1
siriusP
Дата: 30.11.2009 16:55:39
4ton,

За ранее неизвестно, какие будут значения id.
_Alex_SMIRNOV_
Дата: 30.11.2009 16:56:02
Для id > 0
SELECT MIN(l) || '-' || MAX(l) txt
  FROM (SELECT LEVEL l FROM dual CONNECT BY LEVEL <30)
  GROUP BY ceil(l/5)
  ORDER BY ceil(l/5)
  
  
SELECT l, MIN(l) OVER (PARTITION BY ceil(l/5)) || '-' || MAX(l) OVER (PARTITION BY ceil(l/5))
  FROM (SELECT LEVEL l FROM dual CONNECT BY LEVEL <30)
ORDER BY l  
4ton
Дата: 30.11.2009 17:10:15
siriusP,

дык укажите точнее, из условия непонятно, как должен вести себя запрос при других ID. Приведенный вариант не устраивает?
Babe_Vampire
Дата: 30.11.2009 17:28:34
WITH tt AS (SELECT   12 id, 'name1' a FROM DUAL
            UNION ALL
            SELECT   13, 'name2' FROM DUAL
            UNION ALL
            SELECT   16, 'name3' FROM DUAL
            UNION ALL
            SELECT   22, 'name4' FROM DUAL
            UNION ALL
            SELECT   48, 'name5' FROM DUAL)
SELECT   a.d, t.a
  FROM   (  SELECT   MIN (id) || '-' || MAX (id) d, MIN (id) mi, MAX (id) ma
              FROM   (SELECT   id,
                               MIN (rn)
                                  OVER (PARTITION BY FLOOR ( (rn - 1) / 2))
                                  v
                        FROM   (SELECT   id,
                                         ROW_NUMBER () OVER (ORDER BY id) rn
                                  FROM   tt))
          GROUP BY   v) a,
         tt t
 WHERE   t.id BETWEEN a.mi AND a.ma

Не очень красиво, конечно. Буду ждать от Elic.
suPPLer
Дата: 30.11.2009 17:41:04
Babe_Vampire,

я не Elic, но попробую дать запрос по второму вопросу ТС:

WITH tt AS (SELECT   12 id, 'name1' a FROM DUAL
            UNION ALL
            SELECT   13, 'name2' FROM DUAL
            UNION ALL
            SELECT   16, 'name3' FROM DUAL
            UNION ALL
            SELECT   22, 'name4' FROM DUAL
            UNION ALL
            SELECT   48, 'name5' FROM DUAL)
select decode(odd, 0, lag(id) over(order by id) ||'-'||id, id||'-'||lead(id, 1, id) over(order by id)) d, a
  from (select tt.*, mod(row_number() over(order by tt.id), 2) odd
          from tt) x
andrey_anonymous
Дата: 30.11.2009 17:51:41
Babe_Vampire
Буду ждать от Elic.

Так пойдет?
SQL> 
WITH tt AS (SELECT   12 id, 'name1' a FROM DUAL
            UNION ALL
            SELECT   13, 'name2' FROM DUAL
            UNION ALL
            SELECT   16, 'name3' FROM DUAL
            UNION ALL
            SELECT   22, 'name4' FROM DUAL
            UNION ALL
            SELECT   48, 'name5' FROM DUAL)
-------------< Cut here >--------------------------------
select min(id) over(partition by r)||'-'||max(id) over(partition by r) d
     , a
from ( select 2*ceil(row_number() over(order by id)/2) r, tt.*
from tt)
;
 
D                                                                                A
-------------------------------------------------------------------------------- -----
12-13                                                                            name1
12-13                                                                            name2
16-22                                                                            name3
16-22                                                                            name4
48-48                                                                            name5
 
SQL> 
Babe_Vampire
Дата: 30.11.2009 17:55:27
Не знаю как ТС, а я скажу спасибо "andrey_anonymous" и "SuPPLer"! :)

А то голова под конец дня не смогла в один запрос уместить.
----
Oracle 11.1.0.7 - 64bit - SLES10
andrey_anonymous
Дата: 30.11.2009 17:59:33
Последнее время тут не любят "подзапросов" :)
SQL> 
WITH tt AS (SELECT   12 id, 'name1' a FROM DUAL
            UNION ALL
            SELECT   13, 'name2' FROM DUAL
            UNION ALL
            SELECT   16, 'name3' FROM DUAL
            UNION ALL
            SELECT   22, 'name4' FROM DUAL
            UNION ALL
            SELECT   48, 'name5' FROM DUAL)
-------------< Cut here >--------------------------------
select case mod(row_number() over(order by id),2)
       when 1 then id||'-'||lead(id,1,id) over(order by id)
       else lag(id) over(order by id)||'-'||id
       end d
     , tt.a
from tt
;
 
D          A
---------- -----
12-13      name1
12-13      name2
16-22      name3
16-22      name4
48-48      name5
 
SQL>