我有一个oracle表,类似于下面的表,它存储了人们的姓氏名字和年龄。如果姓氏相同,则属于同一家庭。
LastName FirstName Age
===========================
1 miller charls 20
2 miller john 30
3 anderson peter 45
4 Bates andy 50
5 anderson gary 60
6 williams mark 15
我需要编写一个oracle sql查询 从每个家庭中选出最年轻的人。输出shd选择行1,3,4和6
我该怎么做?
答案 0 :(得分:2)
另一种方式,有点更短:
select lastname
, max(firstname) keep(dense_rank first order by age) as first_name
, max(age) keep(dense_rank first order by age) as age
from you_table_name
group by lastname
order by lastname
结果:
LASTNAME FIRST_NAME AGE
-------- ---------- ----------
Bates andy 50
anderson peter 45
miller charls 20
williams mark 15
答案 1 :(得分:1)
DENSE_RANK()
是一个排序函数,它生成序列号,对于生成的数字,它们是相同的。考虑到一个家庭可以有双胞胎等,我更喜欢在DENSE_RANK()
使用
SELECT Lastname, FirstName, Age
FROM
(
SELECT Lastname, FirstName, Age,
DENSE_RANK() OVER (PARTITION BY LastName ORDER BY Age) rn
FROM tableName
) a
WHERE a.rn = 1
答案 2 :(得分:0)
使用标准SQL 我会这样做......
select *
from family f1
where (
select count(*)
from family f2
where
f2.lastname = f1.lastname
and
f2.age <= f1.age) <= 1
order by lastname;
此SQL为您提供了选择家庭中最年轻/最老的x的可能性。只需将f2.age&lt; = f1.age修改为例如f2.age&gt; = f1.age,&lt; = 1到例如&lt; = 10(获得一个家庭中最年轻/最老的前10名)。