我正在尝试编写一个查询来汇总表格。
我想知道最有效的方法是。
我的数据是这样组织的:
ID | Value | Flag.
----------------------
1 | 45 | 0
1 | 52 | 1
2 | 35 | 0
3 | 50 | 0
如果一个ID重复两次,那么我想取标志= 1的值,否则我想取零
我的尝试:
Select ID,
case when (select count(*) from table a2 where a2.id = a.id) = 2 THEN
1
ELSE
0
END flag,
case when (select count(*) from table a2 where a2.id = a.id) = 2 THEN
(select a2.value from table a2 where a2.id = a.id)
ELSE
a.value
END value
from table a
^^这将导致
1 | 52 | 1
1 | 52 | 1
2 | 35 | 0
3 | 50 | 0
我仍然需要摆脱重复(即第一个或第二个条目需要删除,因为现在我只需要每个ID 1个值),但在我再进一步之前,我意识到这可能不是在效率方面,这是最理想的。
答案 0 :(得分:1)
您可以使用窗口功能执行此操作。
但是,表中的行不会以任何方式排序。没有“第一行”(或第二行或最后一行),除非使用order by
如果你是想要为每个id选择最高value
(或者你实际上并不关心你选择哪个值),你可以使用:
select id,
value
from (
select id,
value
row_number() over (partition by id order by value desc) as rn
from the_table
)
where rn = 1;
答案 1 :(得分:0)
首先,从@a_horse_with_no_name复制。
其次,分区排序需要基于问题中表达的flag
而不是value
。但是,如果有多个行具有相同的id和flag,则需要确定应该选择哪个行,可以通过在max
中使用order by flag desc, value desc
代替分区 - 取决于您的需要
select id,
value,
flag
from (
select id,
value,
flag,
row_number() over (partition by id order by flag desc) rn
from my_table
)
where rn = 1;