mysql按另一列值的get value base分组

cgh8pdjw  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(356)

我有一个长查询返回如下表

item_Id    name            value priority
1        department         A      F
1        department         B      T
1        zone               12     F
1        area             Africa   F
2        department         A      F
2        zone               12     F
2        area              Africa  F
2        area              Europe  T

我能用分组的方法来达到下面的效果吗

item_id   name            value
 1       department       B
 1       zone             12
 1       area            Africa
 2       department        A
 2       zone             12
 2       area             Europe

基本上,我想 name ,并且该值基于优先级,而不连接查询本身

7kqas0il

7kqas0il1#

您可以使用行号()

select * from
(
select item_id, name, value,
  row_number() over(partition by item_id,name order by case when priority='T' then 1 else 2 end) as rn
from tablename 
)A where rn=1
ctrmrzij

ctrmrzij2#

ROW_NUMBER 此处提供一个选项:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY item_Id, name ORDER BY priority DESC) rn
    FROM yourTable
)

SELECT
    item_Id,
    name,
    value
FROM cte
WHERE rn = 1;

演示

这里的策略是为记录的每个项目/部门组(可能是一个或两个记录)分配一个行号序列值。除非不存在,否则为真优先级记录分配的序列值为1,在这种情况下,将为假优先级记录分配1。

vbkedwbf

vbkedwbf3#

我是否可以使用分组来获得以下结果?
是的,你可以用 group by :

select item_id, name,
       coalesce(max(case when priority = 'T' then value end),
                max(value)
               ) as value
from t
group by item_id, name;

还有其他方式来表达逻辑。 row_number() 是其中之一。作为相关子查询:

select t.*
from t
where priority = 'T' or
      not exists (select 1
                  from t t2
                  where t2.item_id = t.item_id and
                        t2.name = t.name and
                        t2.priority = 'T'
                 );

相关问题