是否可以连接表,以便只连接特定有序偏移量的特定行而不是表中的每个匹配记录?
我有两个表,Customer
和MonthlyRecommendation
。 MonthlyRecommendation
指向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方言支持。
答案 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
的格式。您需要为数据进行正确的比较。