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;
请不要使用不适用于您的问题的标记。请不要使用不适用于您的问题的标记。