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
解决方案
您可以使用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
则不需要,因为它们在按字典顺序排序时巧合地已经具有所需的顺序。但我认为这只是一个例子,实际数据中可能不会给出巧合。
推荐阅读
- amazon-web-services - Aws CloudSearch:如何使用 _score 作为过滤器
- activemq - ActiveMQ 调度程序作业计数
- javascript - 将 div 保存为 PDF 时未定义 jsPDF
- excel - 我想在 Power Query 中使用 8 个表进行完全联接,但希望将匹配列中的新记录插入到表的底部
- javascript - `Date(epoch)` 忽略任何参数并返回当前时间的原因是什么?
- java - 为什么此计时器中的 alpha 在此 Java Swing 面板中绘制在其自身之上?
- javascript - TypeOrm 查找与对象数据映射器的关系
- bash - 自动将值从命令行传递到“while-read”循环?
- sql - 多对多独占 IN 查询的 SQL 查询
- javascript - 在 JavaScript 中过滤数组以使其变得唯一