在postgres中取消组合列

时间:2013-01-10 22:40:15

标签: postgresql loops group-by

我有一张桌子,是用cron建造的。 可以说它有两列,小时和作业名称。例如:工作1运行数小时{1,2,3,4},工作2运行数小时{3,4,5,6}。

我需要一个查询,它将列小时分组并列出每小时的作业。

预期产出:

Hours      Job Name
1          Job 1
2          Job 1
3          Job 1, Job2
4          Job 1, Job2
5          Job 2
6          Job 2

2 个答案:

答案 0 :(得分:2)

假设您的jobs列是以逗号分隔的数据类型text(或类似)列表 - 由', '分隔 - 我将其转换为{{3然后string_to_array()分隔行:

SELECT hour, unnest(string_to_array(jobs, ', ')) AS job
FROM   tbl
ORDER  BY 1;

您也可以使用unnest(),这更简单但不会缩放更长的字符串。

相关问题:

在Postgres 9.3 或更高版本中,请改为使用LATERAL加入。假设查询简单且作业已定义为NOT NULL,则此方法可以正常工作,并且通常会根据元素的原始顺序返回作业:

SELECT hour, job
FROM   tbl, unnest(string_to_array(jobs, ', ')) job  -- implicitly LATERAL
ORDER  BY 1;

Count the number of rows that contain a letter/number

对于更复杂的查询或jobs可以是NULL

SELECT hour, job
FROM   tbl
LEFT   JOIN LATERAL unnest(string_to_array(jobs, ', '))
       WITH ORDINALITY AS j(job, ord) ON TRUE
ORDER  BY hour, ord;

WITH ORDINALITY要求Postgres 9.4 仅需要保证数组元素的原始顺序。详细说明:

答案 1 :(得分:1)

如果您有一份工作表,可以将其作为联接方式进行处理:

select cront.hour, j.name
from cront join
     jobs j
     on ', '||jobs||', ' like '%, '||j.name||', '