请教一条sql(多行在某一个字段上的值相同,则根据条件刷选出这多行中的一行)

时间:2022-11-18 15:01:26
当发现记录中有多行在某一个字段上的值相同,则根据条件刷选出这多行中的一行
例如表中数据如下
Id      name     age
1         aa         18
2        bb         19
3         aa        20
4         aa        21
5         cc         22
6        dd          23
当发现多行记录的某一个字段相同,即上表中多行的name相同,则根据某个条件刷选出其中一行,例如当名字相同时选择年龄为20岁的(表中最多只出现一个20岁),如果没有20岁的就就选择这些行中年龄最小的

如果name都唯一,则直接查询出原表记录


如上表,最终我要查询出的记录为
Id    name age
3      aa        20
2      bb        19
5      cc         22
6      dd        23

求教这条sql

1 个解决方案

#1


SELECT * FROM(
SELECT *,
ROW_NUMBER()OVER(PARTITION BY name ORDER BY
CASE WHEN age=20 THEN 0 ELSE 1 END,age
)RN
FROM TB
)T
WHERE RN=1

#1


SELECT * FROM(
SELECT *,
ROW_NUMBER()OVER(PARTITION BY name ORDER BY
CASE WHEN age=20 THEN 0 ELSE 1 END,age
)RN
FROM TB
)T
WHERE RN=1