MySQL - 将 COALESCE 与 DATE_ADD 和 DATE_SUB 结合使用以获得 next/previous 记录
MySQL - Using COALESCE with DATE_ADD and DATE_SUB to get next/previous record
我正在尝试查询 MySQL 到 select 的上一条和下一条记录。我需要帮助一起使用 COALESCE 和 DATE_ADD/DATE_SUB。
SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
COALESCE(DATE_SUB('2019-01-21', INTERVAL 1 DAY),
DATE_SUB('2019-01-21',INTERVAL 2 DAY),
DATE_SUB('2019-01-21', INTERVAL 3 DAY));
我无法使用主键,因为 table are/will 中的行被删除了。日期栏也不一定有固定日期,我要找的是下一个earlier/later日期。
SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL 3 DAY);
上面的查询似乎有效,但是我需要查询 INTERVAL 1 DAY,以防日期不存在移动到 INTERVAL 2 DAY....
select * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL COALESCE(1,2,3,4,5) DAY);
这个也不行。我知道 COALESCE() 函数 returns 第一个非空值,但是我无法使用上面的查询让它工作。我已确认 2019-01-18 的数据存在,但未被 selected。你能给些建议么?
我可以使用替代解决方案。
您可以使用子查询查找 table 中小于 2019-01-21
的最近日期,例如
SELECT *
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date`= (SELECT MAX(`Date`)
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date` < '2019-01-21')
要找到最晚的日期,我们只需稍微调整查询,使用 MIN
和 >
:
SELECT *
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date`= (SELECT MIN(`Date`)
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date` > '2019-01-21')
FWIW,我会用不同的方式写这个...
SELECT x.*
FROM Historical
JOIN
( SELECT deltah
, MAX(date) date
FROM Historical
WHERE date < '2019-01-21'
GROUP
BY deltah
) y
ON y.deltah = x.deltah
AND y.date = x.date
WHERE x.deltah = 'ALTF';
这似乎是最简单的方法:
select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date < '2019-01-21'
order by h.Date DESC
limit 1
为了获得最佳性能,您需要在 (DeltaH, Date)
上建立索引。
如果你想要之前和之后的日期:
(select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date < '2019-01-21'
order by h.Date desc
limit 1
) union all
(select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date > '2019-01-21'
order by h.Date asc
limit 1
);
我不确定是否应该进行一项或两项比较 =
,因此您可以在该日期获得结果。
我正在尝试查询 MySQL 到 select 的上一条和下一条记录。我需要帮助一起使用 COALESCE 和 DATE_ADD/DATE_SUB。
SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
COALESCE(DATE_SUB('2019-01-21', INTERVAL 1 DAY),
DATE_SUB('2019-01-21',INTERVAL 2 DAY),
DATE_SUB('2019-01-21', INTERVAL 3 DAY));
我无法使用主键,因为 table are/will 中的行被删除了。日期栏也不一定有固定日期,我要找的是下一个earlier/later日期。
SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL 3 DAY);
上面的查询似乎有效,但是我需要查询 INTERVAL 1 DAY,以防日期不存在移动到 INTERVAL 2 DAY....
select * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL COALESCE(1,2,3,4,5) DAY);
这个也不行。我知道 COALESCE() 函数 returns 第一个非空值,但是我无法使用上面的查询让它工作。我已确认 2019-01-18 的数据存在,但未被 selected。你能给些建议么?
我可以使用替代解决方案。
您可以使用子查询查找 table 中小于 2019-01-21
的最近日期,例如
SELECT *
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date`= (SELECT MAX(`Date`)
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date` < '2019-01-21')
要找到最晚的日期,我们只需稍微调整查询,使用 MIN
和 >
:
SELECT *
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date`= (SELECT MIN(`Date`)
FROM `Historical`
WHERE `DeltaH` = 'ALTF' AND `Date` > '2019-01-21')
FWIW,我会用不同的方式写这个...
SELECT x.*
FROM Historical
JOIN
( SELECT deltah
, MAX(date) date
FROM Historical
WHERE date < '2019-01-21'
GROUP
BY deltah
) y
ON y.deltah = x.deltah
AND y.date = x.date
WHERE x.deltah = 'ALTF';
这似乎是最简单的方法:
select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date < '2019-01-21'
order by h.Date DESC
limit 1
为了获得最佳性能,您需要在 (DeltaH, Date)
上建立索引。
如果你想要之前和之后的日期:
(select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date < '2019-01-21'
order by h.Date desc
limit 1
) union all
(select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date > '2019-01-21'
order by h.Date asc
limit 1
);
我不确定是否应该进行一项或两项比较 =
,因此您可以在该日期获得结果。