在PostgreSQL中展平加入

时间:2014-03-25 17:25:52

标签: sql postgresql pivot crosstab

是否可以连接表,以便只连接特定有序偏移量的特定行而不是表中的每个匹配记录?

我有两个表,CustomerMonthlyRecommendationMonthlyRecommendation指向Customer并跟踪客户在每个月的某一天发布的产品推荐。

我试图编写一个检索每个客户的查询,以及最近12个月的推荐。只需做:

SELECT c.id, m.date, m.product
FROM Customer AS c
INNER JOIN MonthlyRecommendation AS m ON m.customer_id = c.id

将获取我想要的数据,但我需要将其展平,以便每个客户的数据都在一行中,结果签名如下:

id, date_01, product_01, date_02, product_02, ..., date_12, product_12

在PostgreSQL中有没有办法做到这一点?对于类似的问题,我通常只做12个单独的JOIN,连接每个JOIN的特定子条件,但在这种情况下,条件是相对于表中日期值的顺序。我希望能够指定和ORDER BY,可能是LIMIT和OFFSET,但我不相信,而且SQL方言支持。

1 个答案:

答案 0 :(得分:0)

某些数据库直接支持pivot操作。在Postgres中,您可以使用用户定义的函数,例如交叉表。但聚合方法很简单:

SELECT c.id,
       '2013-01' as date_01, max(case when m.date = '2013-01' then m.product end) as product_01, 
       '2013-02' as date_02, max(case when m.date = '2013-02' then m.product end) as product_02, 
       . . . 
       '2013-12' as date_12, max(case when m.date = '2013-12' then m.product end) as product_12 
FROM Customer c INNER JOIN
     MonthlyRecommendation m
     ON m.customer_id = c.id
GROUP BY c.id;

当然,上面的查询只是猜测date的格式。您需要为数据进行正确的比较。