计算每个值在 PostgreSQL 表中出现的次数?
Posted
技术标签:
【中文标题】计算每个值在 PostgreSQL 表中出现的次数?【英文标题】:Counting how many times each value occurs in a PostgreSQL table? 【发布时间】:2014-10-17 18:22:28 【问题描述】:所以我有一个包含三个重要列的表:商店位置、客户和购买次数。比如:
Store | Customer | Number of purchases
A Larry 2
B Moe 4
C Curly 7
B Tina 1
A Dina 6
C Archer 12
D Mallory 3
我想做的是计算每个购买次数。也就是说,计算客户进行 1 次购买、2 次购买、3 次购买、4 次购买等的次数,类似于按商店分组的直方图。
Store | 1 Purchase | 2 Purchases | 3 Purchases...
A 1 3 2
B 2 1 4
C 1 6 8
D 4 4 2
是否有任何聪明的方法可以做到这一点,而无需手动找出最大购买数量是多少并创建一个分支计数来计算每一个?所以我已经有了
SELECT Store,
Count(CASE number_of_purchases when 1 then 1 else null end) as 1_purchase,
Count(CASE number_of_purchases when 2 then 1 else null end) as 2_purchase,
Count(CASE number_of_purchases when 3 then 1 else null end) as 3_purchase...
FROM table
GROUP BY Store;
但是,由于最大数量会随时间而变化,我希望查询能够自动计算并考虑到这一点。任何帮助将不胜感激!
【问题讨论】:
已修复,感谢您的提示。 您正在寻找的是“枢轴”或“交叉表”查询。查看tablefunc
扩展中的crosstab
函数:postgresql.org/docs/current/static/tablefunc.html
【参考方案1】:
要获得正确的数据,您只需要group by
和一个聚合函数。
select store, number_of_purchases, count(number_of_purchases)
from Table1
group by store, number_of_purchases
order by store, number_of_purchases;
对于格式,您需要使用 tablefunc 扩展中的 crosstab() 函数之一。类似的东西。
select *
from crosstab('select store, number_of_purchases, count(number_of_purchases)
from Table1
group by store, number_of_purchases
order by 1, 2',
'select n from generate_series(1, 12) n order by 1')
as (store text, "1" int, "2" int, "3" int, "4" int,
"5" int, "6" int, "7" int, "8" int,
"9" int, "10" int, "11" int, "12" int)
;
就我个人而言,我不喜欢这种数据的交叉表。您最终可能会得到数百或数千列宽的输出,其中大部分“单元格”为空。
【讨论】:
【参考方案2】:试试这个:
SELECT
Store, number_of_purchases, COUNT(DISTINCT number_of_purchases) AS cnt
FROM table
GROUP BY Store, number_of_purchases
结果将按行(而不是按列)排列,因为您不知道每个商店的最大购买次数是多少。
结果很容易循环,因为它们将按 Store 和 number_of_purchases 排序。
【讨论】:
以上是关于计算每个值在 PostgreSQL 表中出现的次数?的主要内容,如果未能解决你的问题,请参考以下文章
如何计算某些值在 SQL 表中出现的次数并在列中返回该数字?