我有一张桌子:
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
答案 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;