Oracle Объединить строку за строкой - PullRequest
1 голос
/ 06 февраля 2020

Извините, если я не все правильно отформатировал, я впервые пишу здесь, и извините за плохой английский sh.

У меня большой запрос, который возвращает что-то вроде этого:

col1 | col2 |col3|col4
==========================
A    |A1    |A2  |01/01/20
A    |A1    |A3  |01/02/20
A    |' '   |' ' |20/02/20
B    |' '   |' ' |01/01/20
C    |C1    |C2  |01/01/20
C    |C1    |C3  |01/02/20

И я хочу вставить этот результат в таблицу следующим образом:

col1 | col2 |col3|col4
==========================
A    |A1    |A3  |01/02/20
B    |' '   |' ' |01/01/20
C    |C1    |C3  |01/02/20

Я пробовал что-то вроде:

MERGE INTO dest_table d
USING (SELECT ....) a 
on a.col1 = d.col1
WHEN NOT MATCHED THEN INSERT
WHEN MATCHED THEN IF col2 = ' ' THEN do nothing ELSE compare date and keep the most recent one

Когда я делаю это, он вставляет все строки

То, как я хочу, чтобы это работало, выглядит следующим образом:

  • Вставьте «A; A1; A2», потому что НЕ СОГЛАСОВАНО
  • «A; A1; A3» ПОДПИСАНО , потому что «A» был только что вставлен ранее, поэтому введите регистр «MATCHED»
  • "A; ' ';' '"То же, что и предыдущий

Могу ли я сделать что-то подобное с" MERGE INTO "или мне следует попробовать другой метод?

1 Ответ

0 голосов
/ 06 февраля 2020
SELECT DISTINCT col1,
                FIRST_VALUE(col2) OVER (PARTITION BY col1 
                                        ORDER BY CASE WHEN col2 = '  ' 
                                                      THEN DATE '1980-01-01'
                                                      ELSE col4
                                                      END DESC) col2,
                FIRST_VALUE(col3) OVER (PARTITION BY col1 
                                        ORDER BY CASE WHEN col2 = '  ' 
                                                      THEN DATE '1980-01-01'
                                                      ELSE col4
                                                      END DESC) col3,
                FIRST_VALUE(col4) OVER (PARTITION BY col1 
                                        ORDER BY CASE WHEN col2 = '  ' 
                                                      THEN DATE '1980-01-01'
                                                      ELSE col4
                                                      END DESC) col4
FROM test
ORDER BY col1;

скрипка

...