SQL 问题:如何在不对该列进行分组的情况下计算该列中特定值的出现次数?
SQL Query: How to count occurrence of a specific value in a column without grouping on that column?
我有一个 table 这样的:
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
我知道如何通过连接两个子查询来实现,但是有 easier/faster 方法吗?就像这个伪代码:
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
我有一个 table 这样的:
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
我知道如何通过连接两个子查询来实现,但是有 easier/faster 方法吗?就像这个伪代码:
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