如何将时间戳转换为数字

时间:2018-11-22 15:16:44

标签: postgresql

假设我有一个这样的表:

Id      Types      Timestamp

1        A          2014-02-04 00:00:00
2        A          2014-02-05 00:00:00
1        A          2014-02-05 03:59:00 
3        C          2014-05-06 03:59:00
1        B          2014-02-04 03:00:00
2        D          2014-02-05 00:40:00 

我希望输出如下:

Id     1       2        3          4          5           etc
1      A       B        A          C          D           ...
2      A       D        NULL       NULL       NULL
3      C       NULL     NULL       NULL       NULL

是否可以让时间表达类型的顺序。

感谢任何提示。

1 个答案:

答案 0 :(得分:0)

初步评论:

  1. SQL只能返回预定义数量的返回列。恕我直言,最好的方法是将值串联在一个数组中。
  2. 我已将您的输入表命名为MyTable,并将列Timestamp重命名为MyTimestamp,以避免与相应类型的关键字冲突。
  3. 您已将C和D放在输出的第一行中。我会将其视为错字(它们的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