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

Sql 在oracle中如何优先处理特定记录?,sql,oracle,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 cc

我有一张桌子:

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 

您可以使用
row_number()
按每个ID按给定顺序为每一行分配一个编号。使用
大小写
按位置定义顺序

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;

注意:如果位置正好是给定的三个位置,则不需要使用
大小写
,因为按字典顺序排序时,它们恰好已经具有所需的顺序。但我假设这只是一个示例,实际数据中可能没有给出一致性。

您可以使用
行编号()
按ID按给定顺序为每行分配一个编号。使用
案例
按位置定义顺序

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;

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

或者您可以使用以下分组:

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;

或者,您可以通过以下方式使用组:

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;

请不要使用不适用于您的问题的标记。请不要使用不适用于您的问题的标记。