Используйте аналитическую функцию ROW_NUMBER
, чтобы дать каждому коду для каждой группы уникальный идентификатор:
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE table_name ( Product, Code, Value, time ) AS
SELECT 'ABC', 'ASK', 15.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'BID', 18.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'MID', 15.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'ASK', 11.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'BID', 12.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'MID', 10.0, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'ASK', 1.3, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'BID', 1.8, DATE '2018-08-31' FROM DUAL UNION ALL
SELECT 'ABC', 'MID', 1.5, DATE '2018-08-31' FROM DUAL;
Запрос 1 :
SELECT Product,
ask,
bid,
mid,
time
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY Product, Code, time ORDER BY ROWNUM ) AS rn
FROM table_name t
)
PIVOT ( MAX( value ) FOR Code IN (
'ASK' AS ask,
'BID' AS bid,
'MID' AS mid
) )
ORDER BY product, time, rn
Результаты
| PRODUCT | ASK | BID | MID | TIME |
|---------|-----|-----|-----|----------------------|
| ABC | 15 | 18 | 15 | 2018-08-31T00:00:00Z |
| ABC | 11 | 12 | 10 | 2018-08-31T00:00:00Z |
| ABC | 1.3 | 1.8 | 1.5 | 2018-08-31T00:00:00Z |
В идеале у вас должен быть другой столбец, содержащий порядок, так как использование ROWNUM
не гарантирует, что строки будут приведены в согласованном порядке, если Oracle читает строки в другом порядке (или если движение строк включено).