Альтернативный FIRST_VALUE / обходной путь, когда first_value выдает ошибку из-за размера значения varchar - PullRequest
1 голос
/ 28 июня 2019

Ошибка первого_значения,

ORA-06502: PL / SQL: ошибка с числовым значением или значением: буфер символьной строки тоже маленький из-за большого varchar (32767)

Я пробовал first_value и отлично работает, когда входное значение мало, но когда оно становится больше, оно выдает ошибку. Поэтому я не думаю, что не могу использовать first_value, как показано ниже.

SELECT 
ID,
FIRST_VALUE(User) over (partition by id order by date) as firstUser,
FIRST_VALUE(Comment) over (partition by id order by date) as FirstComment,
FIRST_VALUE(User) over (partition by id order by date desc) as lastUser,
FIRST_VALUE(Comment) over (partition by id order by date desc) as LastComment
from table;

Есть ли альтернативный способ объединить два ряда в один. запрос с комментарием ниже - это длительный запрос, поэтому следует избегать его повторного выполнения.

ех.

- ID | User | Date | Comment
- 1 | user1 | 2019/06/25 | comment1
- 1 | user2 | 2019/06/26 | comment2

Ожидаемый результат

- ID | firstUser | FirstComment | lastUser | lastComment  
 1 | user1 | comment1 | user2 | comment2

1 Ответ

0 голосов
/ 28 июня 2019

Я думаю, что вы не должны получать такую ​​ошибку.

Но, если это так, и вы хотите следовать другому подходу, то следующий код для вас:

-- I have used || as a separator.. You can use your own separator, if needed
WITH DATAA (ID1,USER1,DATE1,COMMENT1) AS
(SELECT 1, 'USER1',DATE '2019-06-25','comment1' FROM DUAL UNION ALL
SELECT 1, 'USER2',DATE '2019-06-26','comment2' FROM DUAL)
SELECT
    ID1,
    REGEXP_SUBSTR(USER1, '[^(||)]+') AS FIRSTUSER,
    REGEXP_SUBSTR(COMMENT1, '[^(||)]+') AS FIRSTCOMMENT,
    REGEXP_SUBSTR(USER1, '[^(||)]+$') AS LASTUSER,
    REGEXP_SUBSTR(COMMENT1, '[^(||)]+$') AS LASTCOMMENT
FROM
    (
        SELECT
            ID1,
            RTRIM(XMLAGG(XMLELEMENT(E, USER1, '||').EXTRACT('//text()')
                ORDER BY
                    DATE1
            ).GETCLOBVAL(), '||') AS USER1,
            RTRIM(XMLAGG(XMLELEMENT(E, COMMENT1, '||').EXTRACT('//text()')
                ORDER BY
                    DATE1
            ).GETCLOBVAL(), '||') AS COMMENT1
        FROM
            DATAA
        GROUP BY
            ID1
    );

дБ <> fiddle demo

Приветствия !!

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