DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数
Posted
技术标签:
【中文标题】DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数【英文标题】:DB2 SQL better way to get count of unique values based on ID than SUM+CASE 【发布时间】:2018-08-08 22:28:36 【问题描述】:我能够计算同一记录中每个 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
有没有更好的方法来获取唯一值的计数?
【问题讨论】:
这个方法很好。 以什么方式更好?如果您希望像示例中那样“旋转”输出,那么您的代码就是最好的解决方案。我想您可以将CASE
隐藏在 UDF 中,但如果不编写自己的用户定义聚合函数,您仍然需要 SUM
【参考方案1】:
试试:
Select distinct Id, Count2, Count3
from Table
Outer Apply (select count(id) as Count2 from table t
where t.id = Table.id and value = 2) c2
Outer Apply (select count(id) as Count3 from table t
where t.id = Table.id and value = 3) c3
Order by Id asc
从我的手机输入,所以可能需要稍微调整一下,但这样的东西应该可以工作
【讨论】:
【参考方案2】:你可以使用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
【讨论】:
【参考方案3】:如果您使用的是 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
【讨论】:
以上是关于DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数的主要内容,如果未能解决你的问题,请参考以下文章
iSeries DB2 SQL - 使用 CASE 语句更新 UDF 中的变量
有没有比在开头使用 1=1 更好的方法来动态构建 SQL WHERE 子句?
SQL:有没有比“COALESCE on two selects”更好的方法来查找 OR 子句中的第一个非空结果?