首页 > 解决方案 > 如何在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 

标签: sqloracle

解决方案


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

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则不需要,因为它们在按字典顺序排序时巧合地已经具有所需的顺序。但我认为这只是一个例子,实际数据中可能不会给出巧合。


推荐阅读