【问题标题】:Postgres crosstab and aggregate togetherPostgres 交叉表和聚合在一起
【发布时间】:2017-05-12 07:28:27
【问题描述】:

我有一张这样的桌子purchases

purchase_id|purchase_date|product_id
     1     | 2016-02-04  | 17
     2     | 2016-02-04  | 19
     3     | 2016-02-04  | 17
     ... About 1 million entries

还有一个像这样的表products

product_id
   17
   18
   19
   ... About 30 entries

我想做一个交叉表查询,以给出日期的购买总数,以每个 product_id 为中心,如下所示:

 purchase_date|product_id_17|product_id_18|product_id_19|product_id...
   2016-02-04 |   2         |  0          |  1          | ...
   2016-02-05 | ...

请注意,此表中的值不是取自任何记录,而是匹配的记录数的总和。我相信使用crosstab 和聚合可以做到这一点,但还没有弄清楚如何做到这一点。

  1. 这可以使用 Postgres 完成吗?
  2. 交叉表是正确的做法吗?
  3. 怎么样?

这里的独特之处在于我正在尝试:

  • 做一个交叉表
  • 做一个聚合
  • 同时

请注意,Stack Overflow 上讨论交叉表的其他问题并未解释如何进行交叉表和聚合。

【问题讨论】:

标签: sql postgresql crosstab data-analysis


【解决方案1】:

以下为示例

表-

 create table prods(purchase_id int,purchase_date date,product_id int);

数据-

 insert into prods values (1,'2016-02-04',17);
 insert into prods values (2,'2016-02-04',19);
 insert into prods values (3,'2016-02-04',17);
 insert into prods values (4,'2016-02-05',17);
 insert into prods values (5,'2016-02-05',17);

要获得所需的输出,您可以使用crosstab()-

select *
from crosstab('
 select purchase_date
       ,product_id
       ,count(product_id)::int
from    prods
group by purchase_date
        ,product_id
order by purchase_date
        ,product_id
') as t("purchase_date" date
        ,"product_id_17" int
        ,"product_id_19" int
        )

输出-

purchase_date product_id_17 product_id_19 
------------- ------------- ------------- 
2016-02-04    2             1             
2016-02-05    2             NULL  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多