确定具有相同 ID 的前一条记录的时间跨度
Determining the timespan to the previous record with the same ID
我有一个 table 在不同的日期多次出现相同的动物 ID。
tableA
+-----------+------------+
| animalid | calvdate |
+-----------+------------+
| A | 2018-08-30 |
| B | 2018-08-30 |
| A | 2018-09-10 |
| C | 2018-08-30 |
| A | 2019-08-30 |
+-----------+------------+
我想创建一个 table 来计算自上次记录动物日期以来的天数
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
如何生成预期的输出?
此查询将为您提供所需的结果。它 LEFT JOIN
是它自身的原始 table,其中第二个 table 中的 calvdate
比第一个中的最大 calvdate
少。然后我们取这两个日期的差来得到时间长度,使用COALESCE
来处理第二个table:
中没有匹配行
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
您可以使用这个查询:
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 字段。
我有一个 table 在不同的日期多次出现相同的动物 ID。
tableA +-----------+------------+ | animalid | calvdate | +-----------+------------+ | A | 2018-08-30 | | B | 2018-08-30 | | A | 2018-09-10 | | C | 2018-08-30 | | A | 2019-08-30 | +-----------+------------+
我想创建一个 table 来计算自上次记录动物日期以来的天数
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
如何生成预期的输出?
此查询将为您提供所需的结果。它 LEFT JOIN
是它自身的原始 table,其中第二个 table 中的 calvdate
比第一个中的最大 calvdate
少。然后我们取这两个日期的差来得到时间长度,使用COALESCE
来处理第二个table:
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
您可以使用这个查询:
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 字段。