创建一个基于标志过滤的视图
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;
我正在尝试编写一个查询来总结 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;