0

私は、人の姓名と年齢を格納する以下のようなオラクル テーブルを持っています。姓が同じ場合は、同じ家族に属します。

   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 select 行 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 に答える