我可能会这样做:
select
max(val), max(val2), max(val3) from table
group by
val4;
获取此示例输出:
Table
val1 val2 val3 val4
A P Z 1
P Z P 1
对于我的用例,我们假设'P'是一个重要的值,所以如果在按val4分组时某个P出现在某个地方,那就是我要表达的值。也就是说,在这种情况下,我希望在val4分组时为val1,val2,val3表示('P','P','P')。
如何或应该如何做到这一点?
答案 0 :(得分:2)
我只会使用条件聚合。例如:
select coalesce(max(case when val1 = 'P' then val end), max(val1)) as val1,
coalesce(max(case when val2 = 'P' then val end), max(val2)) as val2,
coalesce(max(case when val3 = 'P' then val end), max(val3)) as val3
from table
group by val4;
如果任何值与'P'
匹配,则每个coalesce()
中的第一个表达式返回'P'
。如果没有,则返回最大值。
答案 1 :(得分:0)
您最初可以使用ascii
将字符转换为ascii值,然后使用P
的特殊情况,以使值超出范围。 A-Z的ASCII范围为65-90。
要取回字符值,请使用chr
函数。
此解决方案假设所有字符值都是大写和单个字符。
select
val4,
case when val1 = 100 then 'P' else chr(val1) end val1,
case when val2 = 100 then 'P' else chr(val2) end val2,
case when val3 = 100 then 'P' else chr(val3) end val3
from (
select
val4,
max(case when val1 = 'P' then 100 else ascii(val1) end) val1,
max(case when val2 = 'P' then 100 else ascii(val2) end) val2,
max(case when val3 = 'P' then 100 else ascii(val3) end) val3
from t
group by val4) t
答案 2 :(得分:0)
select
RIGHT(MAX(CASE WHEN val1='P' THEN {fn CONCAT(1,val1)} ELSE {fn CONCAT(0,val1)} end),1),
RIGHT(MAX(CASE WHEN val2='P' THEN {fn CONCAT(1,val2)} ELSE {fn CONCAT(0,val2)} end),1),
RIGHT(MAX(CASE WHEN val3='P' THEN {fn CONCAT(1,val3)} ELSE {fn CONCAT(0,val3)} end),1),
val4
Group by val4
上面的Intersystems Cache SQL ..应该适用于其他风格?
select
RIGHT(MAX(CASE WHEN val1='P' THEN CONCAT(1,val1) ELSE CONCAT(0,val1) end),1),
RIGHT(MAX(CASE WHEN val2='P' THEN CONCAT(1,val2) ELSE CONCAT(0,val2) end),1),
RIGHT(MAX(CASE WHEN val3='P' THEN CONCAT(1,val3) ELSE CONCAT(0,val3) end),1),
val4
Group by val4