修改 - 在Oracle 11& 12。
说我有:
ID | Name | Type
----------------
1 | AAA | 1
2 | AAA | 2
3 | AAA | 3
4 | BBB | 2
5 | BBB | 3
6 | CCC | 1
7 | CCC | 2
我只想返回Names
的明确列表,其中Type = 1
就像这样:
Name | Type
-----------
AAA | 1
CCC | 1
我无法找到一种方法来选择每个名称的第一个条目的类型为1
的名称。
答案 0 :(得分:3)
使用DISTINCT
。
SELECT DISTINCT name, type
FROM yourtable
WHERE type = 1
答案 1 :(得分:2)
“选择每个名称的第一个条目的类型为
的名称1
”
假设ID表示输入顺序。因此,我们希望找到所有记录,其中每个NAME的ID最低的记录的TYPE = 1。
此方法使用分析函数ROW_NUMBER()来为具有NAME的TYPE的出现进行评分。它适用于11g和12c。
with subq as (
select name
, type
, row_number() over (partition by name order by id) as rn
from your_table
)
select name
, type
from subq
where type = 1
and rn = 1
下一种方法仅适用于12c。包含因为MATCH_RECOGNIZE是一些很酷的新语法,并且它可能在大量数据上表现更好。 Find out more
select name, type
from your_table
match_recognize (
partition by name
order by id
measures first (type1.id) as t1_id
all rows per match
pattern ( ^type1 )
define
type1 as type = 1
此示例中不需要MEASURES子句,但在调试时在预测中包含t1_id
非常有用,以确认查询返回了我们期望的行。