创建一个基于标志过滤的视图

Creating a view that filters based on a flag

我正在尝试编写一个查询来总结 table。

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

我的数据是这样组织的:

ID | Value | Flag.
----------------------
1 | 45 | 0
1 | 52 | 1
2 | 35 | 0
3 | 50 | 0

如果一个 ID 重复两次,那么我想取 flag=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 一个值),但在我继续之前,我已经意识到这在效率方面可能不是最理想的。

您可以使用 window 函数来完成此操作。

但是 table 中的行没有以任何方式排序。没有 "the first row"(或第二个或最后一个) 除非 你使用 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;

首先,复制自@a_horse_with_no_name。

其次,分区排序需要基于 flag 而不是问题中表达的 value 。但是,如果有多个具有相同 ID 和标志的行,您需要决定应该选择哪一个,也许可以通过在分区中执行 order by flag desc, value desc 而使用 max 值 - 取决于您的需要.

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;