Oracle сортировать значения в столбец - PullRequest
1 голос
/ 09 июля 2020

У меня есть такая таблица:

time        length  name 
00:01:00         2    a 
00:11:22         2    a 
01:01:00        45    a 
00:23:00         3    b

, и я хочу получить данные из таблицы в форме:

a                        b
time        length       time length
00:01:00         2   00:23:00      3
00:11:22         2    
01:01:00         2    

, так что это простая задача переупорядочения данных , atm Я делаю это в сценарии bash, но мне интересно, есть ли простой способ сделать это в Oracle?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Вы можете использовать аналитические функции ROW_NUMBER и full outer join следующим образом:

WITH CTE1 AS 
(SELECT T.*, ROW_NUMBER() OVER (ORDER BY LENGTH, TIME) AS RN FROM YOUR_TABLE T WHERE NAME = 'a'),
CTE2 AS 
(SELECT T.*, ROW_NUMBER() OVER (ORDER BY LENGTH, TIME) AS RN FROM YOUR_TABLE T WHERE NAME = 'b')
SELECT A.TIME, A.LENGTH, B.TIME, B.LENGTH
FROM CTE1 A FULL OUTER JOIN CTE2 B
ON A.RN = B.RN

Примечание: вам необходимо использовать правильный порядок, чтобы упорядочить записи в соответствии с вашими требованиями. Я использовал LENGTH, TIME

1 голос
/ 09 июля 2020

Вы можете использовать сводную таблицу с несколькими столбцами, добавив дополнительный столбец, который связывает связанные значения A и B; предположительно по временному порядку, что-то вроде:

select time_col, length_col, name_col,
  dense_rank() over (partition by name_col order by time_col) as rnk
from your_table;

TIME_COL LENGTH_COL N        RNK
-------- ---------- - ----------
00:01:00          2 a          1
00:11:22          2 a          2
01:01:00         45 a          3
00:23:00          3 b          1

, а затем поворот на основе этого:

select *
from (
  select time_col, length_col, name_col,
    dense_rank() over (partition by name_col order by time_col) as rnk
  from your_table
)
pivot (
  max(time_col) as time_col, max(length_col) as length_col
  for name_col in ('a' as a, 'b' as b)
);

       RNK A_TIME_C A_LENGTH_COL B_TIME_C B_LENGTH_COL
---------- -------- ------------ -------- ------------
         1 00:01:00            2 00:23:00            3
         2 00:11:22            2                      
         3 01:01:00           45                      

Я оставил значение rnk в выводе; если вы не хотите, чтобы вы могли перечислить столбцы в списке выбора:

select a_time_col, a_length_col, b_time_col, b_length_col
from ...

Или вы можете сделать то же самое с условной агрегацией (которая в любом случае используется pivot под капотом):

select
  max(case when name_col = 'a' then time_col end) as time_col_a,
  max(case when name_col = 'a' then length_col end) as length_col_a,
  max(case when name_col = 'b' then time_col end) as time_col_b,
  max(case when name_col = 'b' then length_col end) as length_col_b
from (
  select time_col, length_col, name_col,
    dense_rank() over (partition by name_col order by time_col) as rnk
  from your_table
)
group by rnk
order by rnk;

TIME_COL LENGTH_COL_A TIME_COL LENGTH_COL_B
-------- ------------ -------- ------------
00:01:00            2 00:23:00            3
00:11:22            2                      
01:01:00           45                      

db <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...