如何在postgresql中连接不同行中的时间戳?

时间:2017-11-16 11:57:11

标签: postgresql

我正在寻找一种在两个不同的行中连接时间戳的方法,例如,我有这个表:

Qenter image description here

我希望它按工作日分组,并将min(start_hour)与max(start_hour)连接起来,得到类似的东西

enter image description here

我正在使用此查询来检索第一个图像结果

1 个答案:

答案 0 :(得分:0)

如果提供的信息,下面的查询应该为您提供所需的信息。我做了一些假设。那是' 00:00'在开始和结束时间不是有效时间,可以忽略。如果他们被认为是有效的,那么周五的输出将是&00; 00:00:00' - ' 11:30:00'。

我创建了两个CTE,一个用于开始时间,另一个用于结束时间,其中值不是00:00:00'。在CTE上添加了一个行号,这样我就可以匹配当天和row_number给你一套。

SELECT day
    ,array_to_string(array_agg(t.shift), ',') shifts
FROM (
    WITH cte_start AS (
            SELECT row_number() OVER (PARTITION BY day)
                ,day
                ,start_hour
            FROM test22
            WHERE start_hour <> '00:00:00'::time
            )
        ,cte_stop AS (
            SELECT row_number() OVER (PARTITION BY day)
                ,day
                ,stop_hour
            FROM test22
            WHERE stop_hour <> '00:00:00'::time
            )
    SELECT cte_start.day
        ,cte_start.start_hour::varchar || ' - ' || cte_stop.stop_hour::varchar AS shift
    FROM cte_start
    LEFT OUTER JOIN cte_stop ON cte_start.day = cte_stop.day
        AND cte_start.row_number = cte_stop.row_number
    ) T
GROUP BY T.day

-HTH