创建基于标记

时间:2016-12-07 16:22:18

标签: sql oracle greatest-n-per-group

我正在尝试编写一个查询来汇总表格。

我想知道最有效的方法是。

我的数据是这样组织的:

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个值),但在我再进一步之前,我意识到这可能不是在效率方面,这是最理想的。

2 个答案:

答案 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;