我正在尝试编写一个函数来聚合一个非常大的Sybase IQ表中的某些文本数据列。我无法更改所提供数据的格式。
每一行代表一个有点像测试的过程的值。密钥是非唯一的,值也是文本字符串,只能“通过”或“失败”。
在实际的表中可能有多个“Value”列 - 但为了简洁,我只展示了一个。
规则是如果一切都通过了密钥,那么它就是一个通行证。否则就是失败。在一个理想的世界里,我希望能够编写一个类似的聚合函数:
count(all(mytable.value == 'pass'))
以下是数据示例:
| Key | Value |
| A | fail |
| A | pass |
| B | pass |
| B | pass |
| B | pass |
| C | fail |
| C | fail |
汇总数据如下所示:
| Key | Value |
| A | fail |
| B | pass |
| C | fail |
那么有一种优雅的方式吗?
仅供参考,Sybase IQ - 不是常规的Sybase! ; - )
答案 0 :(得分:2)
我不了解Sybase-IQ,但使用标准SQL可以这样做:
select key, min(value) as value
from mytable
group by key
having sum(case when value = 'pass' then 1 else 0 end) = count(value)
or sum(case when value = 'fail' then 1 else 0 end) = count(value);
或者使用达米恩的建议:
select key, min(value)
from mytable
group by key
having min(value) = max(value)
答案 1 :(得分:2)
这似乎是最简单的解决方案......
select
key
,sum(case when value = 'pass' then 1 else 0 end) as num_passed
,count(*) as num_tests
from mytable
group by key
having num_tests = num_passed