如何优先处理oracle中的特定记录?

时间:2018-08-30 01:26:52

标签: sql oracle

我有一张桌子:

id     name    location
1      aaa     home
1      aaa     village
1      aaa     office
2      bbb     village
2      bbb     office
3      ccc     home
3      ccc     office

当我编写查询时,我应该为每个查询获得一条记录 优先居所>办公室>乡村

输出:

1 aaa home
2 bbb office
3 ccc home 

2 个答案:

答案 0 :(得分:3)

您可以使用row_number()按照ID的给定顺序为每行分配一个数字。使用CASE来按位置定义顺序。

SELECT x.id,
       x.name,
       x.location
       FROM (SELECT t.id,
                    t.name,
                    t.location,
                    row_number() OVER (PARTITION BY t.id
                                       ORDER BY CASE location
                                                  WHEN 'home' THEN
                                                    1
                                                  WHEN 'office' THEN
                                                    2
                                                  WHEN 'village' THEN
                                                    3
                                                  ELSE
                                                    4
                                                END)
                    FROM elbat) x
       WHERE x.rn = 1;

注意:如果位置恰好是给定的三个位置,则不需要CASE,因为按字典顺序排序时,它们恰好具有所需的顺序。但是我认为这只是一个例子,实际数据中可能不会给出巧合。

答案 1 :(得分:0)

或者您可以使用分组依据:

SELECT 
   t.id, 
   t.name, 
   min( t.location ) keep (dense_rank first order by CASE location
                                                     WHEN 'home' THEN  1
                                                     WHEN 'office' THEN 2
                                                     WHEN 'village' THEN 3
                                                     ELSE  4
                                                     END
                            ) as location
FROM your_table t
GROUP BY 
   t.id, 
   t.name;