sqlite - SQL查询:如何计算列中特定值的出现而不对该列进行分组?
问题描述
我有一张这样的桌子:
id | value
1 | a
1 | a
1 | b
1 | c
2 | a
2 | a
2 | a
2 | c
我想count(*) by id
然后count(value==a) by id
,这意味着这是预期的结果:
id | total_counts | a_counts
1 | 4 | 2
2 | 4 | 3
我知道如何通过加入两个子查询来做到这一点,但是有没有更简单/更快的方法呢?像这样的伪代码:
SELECT id, COUNT(*) AS total_counts, COUNT(value==a) AS a_counts
FROM table
GROUP BY id
不确定是否有办法做这COUNT(value==a)
部分。请帮助。
解决方案
你可以使用SUM
:
SELECT id, COUNT(*) AS total_counts, SUM(value='a') AS a_counts
FROM table
GROUP BY id;
或者,如果你有 SQLite 3.25,你可以使用窗口版本:
SELECT /*DISTINCT*/
id,
COUNT(*) OVER(PARTITION BY id) AS total_counts,
COUNT(*) FILTER (WHERE value = 'a') OVER(PARTITION BY id) AS a_counts
FROM tab
推荐阅读
- c# - 如何将 RedirectUrl 上的参数传递给新的 ActionResult
- django - DJANGO - 我如何过滤另一个对象过滤的对象过滤
- reactjs - 映射错误:无法读取未定义的属性“地图”
- php - 尝试获取日期格式联系表 7 发布数据
- r - 使用 LASSO 进行 R 特征选择
- reactjs - Apollo 3 分页与开始和限制更多以及字段策略
- python - 使用不同的规则重命名列
- wcf - netstandard2.0 中的 WCF 通信(不支持 IServiceBehavior 和其他类)
- laravel - 根据 user_id 对数据进行排序
- c - 为什么我不能将 'char* const *' 类型的参数传递给期望 'const char* const*' 作为参数的函数?