Redshift Слияние строк и разрешение конфликтов по отметке времени - PullRequest
0 голосов
/ 06 мая 2019

Это не похоже на строку выбора с последним вопросом о временной отметке и относится к Redshift

Я хочу разрешить пользователям обновлять части (промежуточной) таблицыСтрока в разные моменты времени , избегая при этом UPDATE операторов .Это делается с помощью подхода только при добавлении, где мы продолжаем добавлять строки, где только уникальный идентификатор и отметка времени являются обязательными, а другие столбцы могут иметь или не иметь предоставленное значение.

Вопрос:

Учитывая таблицу, в которой кроме «первичного ключа» (ненадлежащим образом) и столбца метки времени, все остальные столбцы в этой таблице обнуляются , как объединить все строки, имеющие один и тот же первичный ключ, в однустрока путем выбора самого последнего ненулевого значения для каждого столбца, допускающего значение NULL , если существует одно такое ненулевое значение.

Пример:

|id|timestamp|status|stringcol|numcol|
|1 |456      |begin |         |      |
|1 |460      |      |         |  2   |
|2 |523      |      |  foo    |      |
|1 |599      |mid   |  blah   |      |
|2 |624      |begin |         |      |
|1 |721      |done  |         |  60  |

должно выдать

|id|timestamp|status|stringcol|numcol|
|2 |624      |begin |  foo    |      |
|1 |721      |done  |  blah   |  60  |

1 Ответ

1 голос
/ 06 мая 2019

Этого можно добиться с помощью функции LISTAGG Redshift в сочетании с функцией SPLIT_PART.

Используя приведенный выше примерТаблица из 5 столбцов, вам нужно что-то вроде этого:

SELECT id, 
       MAX(last_updated),
       SPLIT_PART(LISTAGG(status, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1),
       SPLIT_PART(LISTAGG(stringcol, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1),
       SPLIT_PART(LISTAGG(numcol, ',') WITHIN GROUP(ORDER BY last_updated DESC), ',', 1)
FROM table
GROUP BY 1;
...