EngrKhizarIqbal Ответов: 2

Получите младшего ребенка от каждого родителя


Здравствуйте, я не очень хорошо знаком с TSQL. Я работал над решением и попал в проблему.

У меня есть такая структура таблицы:

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
);

С этой записью присутствующей в таблице:
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);

Чего я хочу добиться, так это получить самого младшего ребенка для каждого родителя. Как и в приведенном выше примере данных, ожидаемый результат должен быть:

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


Заранее спасибо за вашу помощь.

Что я уже пробовал:

Я пробовал несколько решений, таких как Союзы, соединения, с CTE (...) и т.д. Но все напрасно. Как я уже упоминал ранее, я не являюсь экспертом в написании запросов TSQL.

Meysam Tolouee

Но младшему ребенку 18 лет, а не 25!

2 Ответов

Рейтинг:
2

Meysam Tolouee

Вы также можете использовать CTE:

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;


Рейтинг:
0

OriginalGriff

Ваши данные и/или ожидаемый результат неверны: 18 лет-это самый младший ребенок в обоих случаях для этих данных.

Начните с поиска самого младшего ребенка каждого родителя:

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, чтобы получить родительское имя:
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;
Затем вы можете использовать объединение для объединения двух результирующих наборов.