2017-05-24 94 views
0
WITH base AS (
    SELECT 'ID1' as id, 0 as foo 
    UNION 
    SELECT 'ID1' as id, -1 as foo 
    UNION 
    SELECT 'ID2' as id, 2 as foo 
    UNION 
    SELECT 'ID2' as id, null as foo 
    UNION 
    SELECT 'ID2' as id, -1 as foo 
    UNION 
    SELECT 'ID2' as id, 1 as foo 
) 
select 
    id 
    ,MAX(CASE WHEN char_length(foo) > 0 THEN foo ELSE NULL END) 
from base 
GROUP BY id 
ORDER BY id ASC 

此查询返回ID1的2和ID2的2。SQL:选择原始最高绝对值

我想要的是一个SELECT表达式,它将为ID1返回-1,为ID2返回2。

MAX(ABS())几乎是我想要的,但它返回1而不是-1。我不能使用JOIN和其他任何东西,只有一个SELECT表达式。有任何想法吗?

+0

凡在你的CTE做列称为'ID1'和'ID2'出现? –

+0

@TimBiegeleisen没有列ID1和ID2。这些是“id”列的值。我改变了值,所以它不那么容易混淆。 –

+0

如果多个ID具有最大foo值,会发生什么情况? –

回答

2

这是解决这个问题的一种方法:

select 
    id 
    ,MAX(ABS(foo)) * CASE WHEN ABS(MIN(foo)) > MAX(foo) THEN -1 ELSE 1 END As MaxAbs 
from base 
GROUP BY id 
ORDER BY id ASC 

结果:

id  MaxAbs 
ID1  -1 
ID2  2