将case与join结合使用时,case返回多个值

时间:2018-07-11 12:18:42

标签: sql postgresql join case amazon-redshift

我在使用案例时遇到问题,并在redshift中加入 (这不是我的真实数据,仅用于示例,因此max不能帮助我)。 这是我的查询:

select a.num1, 
(case when b.param = 'd' then b.param
when b.param = 'c' then b.param
when b.param = 'b' then b.param
when b.param = 'a' then b.param end)
from table a inner join table b on a.num1 = b.num1

对于表a:

enter image description here

对于表b:

enter image description here

我得到的结果是:

enter image description here

但是我只想为每个'num1'的情况获得第一个匹配项,例如:

enter image description here

我该如何实现?谢谢!

2 个答案:

答案 0 :(得分:2)

对于此数据,您可以使用max()

select a.num1, 
       max(case when b.param = 'd' then b.param
                when b.param = 'c' then b.param
                when b.param = 'b' then b.param
                when b.param = 'a' then b.param
           end)
from table a inner join
     table b
     on a.num1 = b.num1
group by a.num1;

这可以简化为:

select a.num1, max(b.param)
from table a inner join
     table b
     on a.num1 = b.num1
group by a.num1;

这回答了您提出的问题。这可能无法解决您的实际问题。我建议您问一个另一个问题,并提供更合适的示例数据并更好地描述您想做什么。

答案 1 :(得分:0)

这个问题在 another question I've opened

我需要使用coalesce

SELECT a.id,
       COALESCE( MAX(CASE WHEN b.param_type = 'Ignition' THEN a.param_value END), 
                 MAX(CASE WHEN b.param_type = 'Turn' THEN a.param_value END),
                 MAX(CASE WHEN b.param_type = 'Speed' THEN a.param_value END),
                 MAX(CASE WHEN b.param_type = 'Break' THEN a.param_value END)
               ) as value
FROM public.tbl_a a JOIN
     public.tbl_b
     ON b.id = a.id
GROUP BY a.id;