与SUM + CASE相比,DB2 SQL是更好的基于ID获取唯一值计数的方法

时间:2018-08-08 22:28:37

标签: sql performance db2

我能够计算同一记录中每个ID的唯一值的出现次数,但是似乎必须有一种更有效的方法?像COUNT([Value],'2')一样?

这是一个简单的例子

ID | Value
 1      2
 1      3
 1      3
 1      2
 2      2
 2      3
 2      3
 3      3

这是我当前的代码:

SELECT ID, SUM(CASE WHEN Value = '2' THEN 1 ELSE 0 END) AS "COUNT2", 
SUM(CASE WHEN Value = '2' THEN 1 ELSE 0 END) AS "COUNT3"
FROM TABLE
GROUP BY ID

结果是:

ID | Count2 | Count3
 1      2        3
 2      1        2
 3      0        1

是否有更好的方法来获取唯一值的计数?

3 个答案:

答案 0 :(得分:1)

尝试:

ID                         | Value
-------------------------- | -------------------------------
AAA1|404744                | 1.7554
ANKHD1-EIF4EBP3|404734     | 0.5174     
HLA-B|3106                 | 11.7659               
HLA-A|3105                 | 18.0851  

从我的手机中键入内容,可能需要稍作调整,但类似的操作应该可以

答案 1 :(得分:0)

如果“更好”表示您更简洁,则可以使用DECODE

WITH I (ID, V) AS (VALUES 
  (1,2)
, (1,3)
, (1,3)
, (1,2)
, (2,2)
, (2,3)
, (2,3)
, (3,3)
)
SELECT
    ID
,   COUNT(DECODE(V,2,1)) AS "Count2"
,   COUNT(DECODE(V,3,1)) AS "Count3"
FROM I
GROUP BY
    ID

返回

 ID Count2 Count3
 -- ------ ------
  1      2      2
  2      1      2
  3      0      1

答案 2 :(得分:0)

如果您以后使用的是Db2 LUW 11.1.1.1,则可以利用以下事实:可以SUM BOOLEAN个值。

WITH I (ID, V) AS (VALUES 
  (1,2)
, (1,3)
, (1,3)
, (1,2)
, (2,2)
, (2,3)
, (2,3)
, (3,3)
)
SELECT
    ID
,   SUM(V=2) AS "Count2"
,   SUM(V=3) AS "Count3"
FROM I
GROUP BY
    ID