Предварительные комментарии:
- SQL может возвращать только предварительно определенное количество возвращаемых столбцов.ИМХО, лучшее, что вы можете получить, - это значения, объединенные в массив.
- Я назвал вашу входную таблицу
MyTable
и переименовал столбец от Timestamp
до MyTimestamp
, чтобы избежать конфликта с ключевым словом соответствующего типа. - Вы поместили C и D в 1 строку вашего вывода.Я буду рассматривать это как опечатку (они не на ID = 1)
-
WITH RECURSIVE ConcatAndOrder(ID, MyResult, RowNumForOrder, RowCountForOrder) AS (
SELECT ID, ARRAY[Type], RowNumForOrder, RowCountForOrder
FROM IndexedTable
WHERE RowNumForOrder = 1
UNION ALL
SELECT I.ID, MyResult || I.Type, I.RowNumForOrder, I.RowCountForOrder
FROM IndexedTable I
JOIN ConcatAndOrder C on I.ID = C.ID and I.RowNumForOrder = C.RowNumForOrder + 1
), IndexedTable(ID, Type, RowNumForOrder, RowCountForOrder) AS (
SELECT ID, Type,
row_number() OVER (PARTITION BY ID ORDER BY MyTimestamp),
count(*) OVER (PARTITION BY ID)
FROM MyTable
)
SELECT ID, MyResult
FROM ConcatAndOrder
WHERE RowNumForOrder = RowCountForOrder
ORDER BY ID