Postgres 交叉表和聚合在一起
Postgres crosstab and aggregate together
我有一个 table 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
和 table 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 | ...
请注意,此 table 中的值 不是 从任何记录中提取的,而是 匹配的记录数的总和 。我相信将 crosstab
与聚合一起使用是可能的,但一直无法弄清楚如何去做。
- 这可以使用 Postgres 完成吗?
- 交叉表是正确的方法吗?
- 如何?
这里的独特之处在于我正在尝试:
- 做一个交叉表
- 进行汇总
- 同时
请注意,Stack Overflow 上讨论交叉表的其他问题并未解释如何进行交叉表和聚合。
以下为样本
Table-
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
我有一个 table 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
和 table 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 | ...
请注意,此 table 中的值 不是 从任何记录中提取的,而是 匹配的记录数的总和 。我相信将 crosstab
与聚合一起使用是可能的,但一直无法弄清楚如何去做。
- 这可以使用 Postgres 完成吗?
- 交叉表是正确的方法吗?
- 如何?
这里的独特之处在于我正在尝试:
- 做一个交叉表
- 进行汇总
- 同时
请注意,Stack Overflow 上讨论交叉表的其他问题并未解释如何进行交叉表和聚合。
以下为样本
Table-
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