0

我有一个类似于下面的 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 行

我该怎么做呢 ?

4

3 回答 3

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 演示

于 2013-09-24T19:52:43.087 回答
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
于 2013-09-24T19:42:07.270 回答
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 <= f1.age 修改为例如 f2.age >= f1.age,并将 <= 1 修改为例如 <=10(以获得家庭中最年轻/最年长的前 10 个)。

SQLfiddle

于 2013-09-24T19:58:02.213 回答