Выберите разницу в дате между несколькими записями с одного и того же идентификатора - PullRequest
1 голос
/ 11 июня 2019

Мне нужно рассчитать количество месяцев, прошедших между родами матери.Если бы у матери был только один ребенок, это число должно быть 0. Для близнецов это также будет 0 (та же дата рождения).Я думаю, что это может сработать, но в основном это неэффективно.Каков хороший способ сделать это?

CREATE TABLE Births (
MotherID int,
ChildID int,
ChildBDate date,
BirthOrder int
);


INSERT INTO Births (MotherID, ChildID, ChildBDate, BirthOrder)
VALUES ('1234567', '7654321', '1977-01-02', '1'), 
       ('1234567', '6548721', '1981-05-04', '2'), 
       ('1234567', '4548712', '1983-10-19', '3'), 
       ('5587214', '4477441', '1986-07-21', '1'),
       ('4452012', '6782114', '1991-08-22', '1'),
       ('4452012', '8754557', '1991-08-22', '2');

SELECT MotherID,
       ChildID,
       ChildBDate,
       BirthOrder,
       BirthInterval = DATEDIFF(MONTH, a.childbdate, B.childbdate)
FROM Births a
    JOIN Births B
        ON a.motherID = B.motherID
WHERE a.BirthOrder= 1
         AND b.BirthOrder= 2
      OR a.BirthOrder= 2
         AND b.BirthOrder= 3
      OR a.BirthOrder= 3
         AND b.BirthOrder= 4
      OR a.BirthOrder= 4
         AND b.BirthOrder= 5
      OR a.BirthOrder= 1
         AND b.BirthOrder= 1

1 Ответ

0 голосов
/ 11 июня 2019

Вы можете использовать агрегацию:

select motherId,
       coalece(datediff(day, min(childbdate), max(childbdate)) / nullif(count(*) - 1, 0), 0)
from births b
group by motherId;

Среднее время между рождениями - это промежуток от самого раннего рождения до самого последнего рождения, деленный на единицу меньше числа рождений.

nullif() предотвращает деление на ноль.coalesce() затем превращает матерей-одиночек в 0.

РЕДАКТИРОВАТЬ:

Я думаю, что я неправильно понял.Похоже, вы хотите lag():

select b.*,
       datediff(day, 
                lag(b.childbdate, 1, b.childbdate) over (partition by motherId order by b.birthorder),
                b.childbdate
               ) as birthinterval
from births b;

Я не уверен, как это работает с близнецами.

Здесь - это db <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...