PostgreSQL中计算两列元素配对出现的相对占比
解决方案
假设你的表名为your_table_name,可以使用以下SQL语句实现需求:
SELECT elem1, elem2, COUNT(*)::FLOAT / COUNT(*) OVER (PARTITION BY elem1) AS percentage FROM your_table_name GROUP BY elem1, elem2 ORDER BY elem1, elem2;
逻辑说明
- 通过
GROUP BY elem1, elem2统计每个elem1-elem2组合的出现次数; - 利用窗口函数
COUNT(*) OVER (PARTITION BY elem1)计算每个elem1分组下的总记录数; - 将组合的出现次数除以对应
elem1的总记录数,通过::FLOAT转换为浮点型,避免整数除法导致的精度丢失; - 最后按
elem1和elem2排序,与预期输出格式一致。
原表数据
| elem1 | elem2 |
|---|---|
| A | A |
| A | A |
| A | B |
| A | C |
| B | D |
| B | C |
| C | E |
预期输出结果
| elem1 | elem2 | percentage |
|---|---|---|
| A | A | 0.5 |
| A | B | 0.25 |
| A | C | 0.25 |
| B | D | 0.5 |
| B | C | 0.5 |
| C | E | 1 |
内容的提问来源于stack exchange,提问作者Mikhael Abdallah
相关产品推荐
相关产品推荐

