2016-02-08 3 views
0
select distinct account_num from account order by account_num; 

выше запрос дал результат нижеSplit столбец на несколько столбцов

    account_num 
         1 
         2 
         4 
         7 
         12 
         18 
         24 
         37 
         45 
         59 

Я хочу, чтобы разделить столбец ACCOUNT_NUM в кортеж из трех аккаунтов как (1,2,4), (7, 12,18); (24,37,45), (59); Последний кортеж имеет только одну запись, так как больше нет учетной записи account_num. Теперь я хочу, чтобы запрос выводил min и max каждого кортежа. (обратите внимание, что максимум одного кортежа меньше минимального следующего кортежа). Выход желаемого показан ниже

    1 4 
       7 18 
       24 45 
       59 59  

Edit: я объяснил свое требование наилучшим образом я мог

+3

На каком основании вы должны разделить данные? там должно быть что-то, что нужно рассмотреть. Пожалуйста, еще раз проверьте. –

+0

Отсутствуют два значения, можете ли вы описать, какие из них нужно удалить? – jarlh

ответ

0

Это еще одно решение.

SELECT * 
FROM (SELECT DISTINCT MIN(val) over(PARTITION BY gr) min_, 
              MAX(val) over(PARTITION BY gr) max_ 
       FROM (SELECT val, 
             decode(trunc(rn/3), rn/3, rn/3, ceil(rn/3)) gr 
           FROM (SELECT val, 
              row_number() over(ORDER BY val) rn 
               FROM (select distinct account_num from account order by account_num)))) ORDER BY min_ 

ОБНОВЛЕНО

решение без аналитической функции.

SELECT MIN(val) min_, 
     MAX(val) max_ 
FROM (SELECT val, 
      ceil(rn/3) gr 
      FROM (SELECT val, 
         rownum rn 
         FROM A_DEL_ME)) GROUP BY gr 
+0

блестящее использование потолка – RAJ

0

Пожалуйста, добавьте больше информации о том, что вы хотите сделать. Какая связь между account_number 1 и number 4, 7 и 18? Есть ли? Если нет, зачем вы хотите разбить это на два столбца и каково правило для его разделения? С чего вы выложили, вы могли бы сделать что-то вроде этого:

select 1 as account_num, 4 as account_num1 from dual 
union all select 7 as account_num, 18 as account_num1 from dual 
... 

и так далее, но я не вижу, использование для этого.

2

Вы можете использовать приведенный ниже пример в качестве царапины, это зависит только от информации, которую вы предоставили до сих пор. Для получения дополнительной документации, вы можете обратиться analytical functions документации Oracle в:

with src as(--create a source data 
    select 1 col from dual union 
    select 2 from dual union 
    select 4 from dual union 
    select 7 from dual union 
    select 12 from dual union 
    select 18 from dual union 
    select 24 from dual union 
    select 37 from dual union 
    select 45 from dual union 
    select 59 from dual 
) 
select 
    col, 
    decode(col_2, 0, max_col, col_2) col_2 -- for the last row we get the maximum value for the row 
    from (
    select 
     col, 
     lead(col, 2, 0) over (order by col) col_2, -- we get the values from from two rows behind 
     max(col) over() max_col, -- we get the max value to be used for the last row in the result 
     rownum rn from src -- we get the rownum to handle the final output 
) where mod(rn - 1, 3) = 0 -- only get rows having a step of two 
Смежные вопросы