Определение временного интервала к предыдущей записи с тем же идентификатором - PullRequest
1 голос
/ 16 апреля 2019

У меня есть таблица с несколькими вхождениями одного и того же идентификатора животного в разные даты.

tableA
+-----------+------------+
| animalid  |  calvdate  |
+-----------+------------+
| A         | 2018-08-30 |
| B         | 2018-08-30 |
| A         | 2018-09-10 |
| C         | 2018-08-30 |
| A         | 2019-08-30 |
+-----------+------------+

Я хочу создать таблицу, которая рассчитывает количество дней с момента последней записанной даты животного

expected output
+-----------+------------+--------------+
|  animalid |  calvdate  | NumberOfDays |
+-----------+------------+--------------+
| A         | 2018-08-30 |            0 |
| A         | 2018-09-10 |           11 |
| A         | 2019-08-30 |          355 |
| B         | 2018-08-30 |            0 |
| C         | 2018-08-30 |            0 |
+-----------+------------+--------------+

Я пытался использовать следующий запрос:

SELECT
  animalid,
  calvdate, TO_DAYS(x.calvdate)-TO_DAYS(calvdate) AS NumberOfDays, 
  (SELECT calvdate FROM tableA as x WHERE animalid = animalid ORDER BY asc)
FROM
  tableA 

Как мне сгенерировать ожидаемый результат?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Этот запрос даст вам результаты, которые вы хотите. Он LEFT JOIN является исходной таблицей для себя, где calvdate во второй таблице является максимальным calvdate меньше, чем в первой. Затем мы берем разницу между этими двумя датами, чтобы получить промежуток времени, используя COALESCE, чтобы справиться с отсутствием соответствующей строки во второй таблице:

SELECT a.animalid, a.calvdate, 
       COALESCE(TIMESTAMPDIFF(DAY, b.calvdate, a.calvdate), 0) AS NumberOfDays
FROM tableA a
LEFT JOIN tableA b ON b.animalid = a.animalid AND
                      b.calvdate = (SELECT MAX(calvdate) 
                                    FROM tableA a2 
                                    WHERE a2.calvdate < a.calvdate 
                                      AND a2.animalid = a.animalid)
ORDER BY a.animalid

Выход:

animalid    calvdate    NumberOfDays
A           2018-08-30  0
A           2018-09-10  11
A           2019-08-30  354
B           2018-08-30  0
C           2018-08-30  0

Демонстрация по dbfiddle

1 голос
/ 16 апреля 2019

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

SELECT tableA.animalid,tableA.calvdate,TO_DAYS(tableA.calvdate)-TO_DAYS(x.calvdate) AS NumberOfDays 
    FROM tableA 
    inner join (
        SELECT MIN(calvdate), animalid FROM tableA GROUP BY animalid)
    ) x ON tableA.animalid = x.animalid

Используется для получения минимальной даты для всех животных в подзапросе в качестве соединения и использования ее для вычитания, чтобы найти поле NumberOfDays.

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