SQL:根据两个字段的值计算出现次数

SQL:根据两个字段的值计算出现次数,sql,Sql,我正在寻找一种有效的方法来计算两个字段值组合的出现次数 这是我的桌子: field1 field2 1 a 1 b 1 b 2 a 2 b 字段2有一组预定义的可能值(比如“a”和“b”)。 我需要添加列来计算当前字段1值在字段2中每个可能值的行数(例如,对于字段1=1,字段2=“a”出现1次,字段2=“b”出现2次) 输出类似于: field1 field2 field2_a_count field2_b_co

我正在寻找一种有效的方法来计算两个字段值组合的出现次数

这是我的桌子:

field1   field2
1        a
1        b
1        b
2        a
2        b
字段2有一组预定义的可能值(比如“a”和“b”)。 我需要添加列来计算当前字段1值在字段2中每个可能值的行数(例如,对于字段1=1,字段2=“a”出现1次,字段2=“b”出现2次) 输出类似于:

field1   field2  field2_a_count  field2_b_count
1        a       1               2
1        b       1               2
1        b       1               2
2        a       1               1
2        b       1               1
子查询可以完成这项工作,但速度很慢。我想不出我们的解决方案是否有更高效的窗口功能

SELECT
  field1,
  field2,
  (SELECT COUNT(*) FROM table WHERE field1=t.field1 AND field2='a') AS field2_a_count,
  (SELECT COUNT(*) FROM table WHERE field1=t.field1 AND field2='b') AS field2_b_count,
FROM table t

有什么方法可以提高效率吗?

您可以使用窗口函数进行此计算:

SELECT field1, field2,
       SUM(CASE WHEN field2 = 'a' THEN 1 ELSE 0 END) OVER (PARTITION BY field1) as field2_a_count,
       SUM(CASE WHEN field2 = 'b' THEN 1 ELSE 0 END) OVER (PARTITION BY field1) as field2_b_count
FROM table t;