使用MIN或ROWNUM选择一行

时间:2013-09-24 19:39:31

标签: sql oracle

我有一个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

我该怎么做?

3 个答案:

答案 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

SQLFiddle Demo

答案 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名)。

SQLfiddle

相关问题