Oracle - 以每个组的第一行为条件

时间:2017-03-14 15:23:50

标签: oracle conditional grouping

修改 - 在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的名称。

2 个答案:

答案 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非常有用,以确认查询返回了我们期望的行。