【解決方法】各親の最年少の子を取得します


こんにちは、私は TSQL にあまり詳しくありません。 私は解決策に取り組んでいて、問題に陥りました。

次のようなテーブル構造があります。

SQL
CREATE TABLE Family (
  Id INT NOT NULL PRIMARY KEY,
  MotherId INT REFERENCES Family(Id),
  FatherId INT REFERENCES Family(Id),
  Name VARCHAR(30) NOT NULL,
  Age INT NOT NULL
);

このレコードがテーブルに存在する場合:

SQL
INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(1, NULL, NULL, 'David', 65);
    INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(2, NULL, NULL, 'Keti', 55);
    INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(3, 2, 1, 'Crysti', 25);
    INSERT INTO people(Id, MotherId, FatherId, Name, Age) VALUES(4, 2, 1, 'Ellen', 18);

私が達成したいのは、各親の最年少の子供を取得することです。 上記のサンプル データのように、期待される結果は次のようになります。

SQL
Name      Age
=============
David    25
Keti      25

よろしく。

私が試したこと:

私は次のような複数の解決策を試しました UNIONS、JOINS、CTE (…) などなどですが、すべて無駄です。 前述したように、私は TSQL クエリを作成する専門家ではありません。

解決策 1

データおよび/または期待される結果が間違っています: 18 は、そのデータの両方のケースで最年少の子供です。

それぞれの親の末っ子を見つけることから始めます。

SQL
SELECT MotherID, MIN(Age) As Age FROM People GROUP BY MotherID HAVING MotherID IS NOT NULL;

SELECT FatherID, MIN(Age) As Age FROM People GROUP BY FatherID HAVING FatherID IS NOT NULL;

次に、JOIN を使用して親の名前を取得します。

SQL
SELECT a.Name, b.Age FROM People a
JOIN (SELECT MotherID, MIN(Age) As Age FROM People GROUP BY MotherID HAVING MotherID IS NOT NULL) b ON a.ID = b.MotherId;

SELECT a.Name, c.Age FROM People a
JOIN (SELECT FatherID, MIN(Age) As Age FROM People GROUP BY FatherID HAVING FatherID IS NOT NULL) c ON a.ID = c.FatherId;

その後、UNION を使用して 2 つの結果セットを組み合わせることができます。

解決策 2

CTEも使用できます:

SQL
WITH Fathers
    AS (SELECT  F.FatherId, MIN(F.Age) Age
          FROM  dbo.Family AS F
         WHERE  F.FatherId IS NOT NULL
         GROUP BY F.FatherId), Mothers
    AS (SELECT  F.MotherId, MIN(F.Age) Age
          FROM  dbo.Family AS F
         WHERE  F.MotherId IS NOT NULL
         GROUP BY F.MotherId)
SELECT  Fathers.FatherId AS ParentId, Fathers.Age
  FROM  Fathers
UNION ALL
SELECT  Mothers.MotherId, Mothers.Age
  FROM  Mothers;

解決策 4

選択 * から
(
select a.Name, min(b.Age) age from People a INNER JOIN People b ON a.PersonID = b.Father group by a.Name
連合
select a.Name, min(b.Age) from People a INNER JOIN People b ON a.PersonID = b.Mother group by a.Name;
)t
名前順、年齢順

コメント

タイトルとURLをコピーしました