2011-06-13 8 views
6

悪質な件について申し訳ありません。私はより良いものを考えることができず、私は急いでいます。別の成功した集計関数の一致に対応する列の値を選択する集計関数

は、私は以下の表を持って言ってやるがいい。

  • 同上
  • 名前
  • ...

子供

  • 同上
  • ParentIdは
  • 年齢
  • ...

親と子の間には、1対多の関係があります。

ここでは、すべての親とその最年少の子を返すクエリを作成します。 Child.Id

  • も一つだけの行があるはず

    Child.Age

  • Parent.Id
  • 結果

    • :私は、結果はこのようになりたいです結果として表示されます。ここで

      私は今午前どこ

      http://i.stack.imgur.com/L6PjL.png

      欲しいものこれは説明の画像です:

      SELECT 
      Parent.Id AS ParentId, 
      Child.Id AS ChildId, 
      MIN(Child.Age) AS ChildAge -- OVER (PARTITION BY Parent.Id) AS ChildAge 
      FROM Parent JOIN Child ON Parent.Id = Child.ParentId 
      GROUP BY Parent.Id, Child.Id 
      

      は、私が望むどのような子供の周りに配置する集約関数です。これは、MIN(Child.Age)の行に対応しています。私はそのようなものを見つけることができず、私はその行動をエミュレートしているようには見えない。

      ご協力いただきありがとうございます。

    +0

    システムは、インライン画像を許可する前に一定のレピュテーションを必要としましたが、そうするまではそれほど長くはないと確信しています。あなたのイメージをインラインで表示するように編集しました。 – AakashM

    +0

    うん、それは私にそう言った。合理的。編集をありがとう! :) –

    答えて

    6

    PARTITION BY ParentIdOVERを使用してのあなたの考えは正しい方向にあります。しかし、MINと一緒に使用するのではなく、ROW_NUMBER()と一緒に使用して行全体を取得します。この:

    SELECT 
        ParentId 
        , Id 
        , Age 
        , ROW_NUMBER() OVER (PARTITION BY ParentId ORDER BY Age) AS rn 
    FROM Child 
    

    戻り、すべての子どもたち、同じ親の子どもたちの中に自分の年齢順を示す行番号と一緒に、私たちはまさにそれをフィルタリングする必要があります。

    SELECT ParentId, Id, Age FROM (
        SELECT 
         ParentId 
         , Id 
         , Age 
         , ROW_NUMBER() OVER (PARTITION BY ParentId ORDER BY Age) AS rn 
        FROM Child 
    ) c -- need to alias the subquery in order to SELECT from it 
    WHERE rn = 1 
    
    
    ParentId Id   Age 
    ----------- ----------- ----------- 
    1   11   2 
    2   13   4 
    3   15   3 
    4   19   1 
    

    ことあなたは "すべての両親と最年少の子供"を求めている間に、Parentに返されたものを考えてみてください。なし一致するレコードChildその他のすべての情報には、そのようなParentレコードに関する情報は含まれません。

    +0

    +1。 –

    1
    SELECT 
    Parent.Id AS ParentId, 
    C.Id AS ChildId, 
    C.Age AS ChildAge 
    FROM Parent, CHILD C 
    WHERE PARENT.ID = C.ParentId 
    AND C.AGE = 
    (
        SELECT MIN(AGE) 
        FROM CHILD 
        WHERE ParentId = C.ParentId 
    
    ) 
    
    -1

    この1つはうまくいくかもしれない:

    SELECT parentid, id, age FROM child c 
    WHERE age = (SELECT MIN(c2.age) FROM child c2 WHERE c2.parentid = c.parentid); 
    

    注彼らは同じを持っている場合は、(親ごとに複数の子を見つけることがあります。

    SELECT 
    ParentID, 
    ChildId, 
    ChildAge 
    FROM 
    (
    
    SELECT 
    Parent.Id AS ParentId, 
    Child.Id AS ChildId, 
    MIN(Child.Age) AS ChildAge, 
    Ranking = ROW_NUMBER() OVER(PARTITION BY ParentID order by Child.Age asc) 
    
    FROM Parent JOIN Child ON Parent.Id = Child.ParentId 
    GROUP BY Parent.Id, Child.Id, Child.Age 
    )A 
    Where Ranking =1 
    
    -2

    あなたはこのような何かを試すこと、最小年齢)。

    +0

    ああ、私は遅すぎた: – Vincent

    +1

    あなたの質問を再確認してください。それは正しくありません。 "id"は子供に属していません。他にも問題があります。答えを説明するために+1 –

    1
    SELECT 
        Parent.Id AS ParentId, 
        Child.Id AS ChildId, 
        Child.Age AS ChildAge 
    FROM Parent 
        JOIN Child 
        ON Parent.Id = Child.ParentId 
        JOIN 
        (SELECT ParentId, 
          MIN(Age) AS ChildAge 
         FROM Child 
         GROUP BY ParentId 
        ) AS minCh 
        ON Child.ParentId = minCh.ParentId 
        AND Child.Age = minCh.ChildAge