MySQL-使用与DATE_ADD和DATE_SUB合并以获取下一条/上一条记录
我试图通过查询MySQL来选择上一条记录和下一条记录。我需要帮助一起使用COALESCE和DATE\u ADD/DATE\u SUBMySQL-使用与DATE_ADD和DATE_SUB合并以获取下一条/上一条记录,mysql,sql,coalesce,Mysql,Sql,Coalesce,我试图通过查询MySQL来选择上一条记录和下一条记录。我需要帮助一起使用COALESCE和DATE\u ADD/DATE\u 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
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));
我无法使用主键,因为表中的行正在/将要删除。date列也不一定有固定的日期,我想找到的是下一个更早/更晚的日期
SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL 3 DAY);
上面的查询似乎有效,但是我需要查询间隔1天,如果日期不存在,请移动到间隔2天
select * from `Historical` where `DeltaH` = 'ALTF' and `Date`=
DATE_SUB('2019-01-21', INTERVAL COALESCE(1,2,3,4,5) DAY);
这个也不行。我知道COALESCE函数返回第一个非null值,但是我无法使用上面的查询使其工作。我已确认2019-01-18的数据存在,但未被选择。你能给个建议吗
我同意使用替代解决方案 您可以使用子查询查找表中小于2019-01-21的最近日期,例如
您可以使用子查询查找表中小于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';
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
我不确定一个或两个比较是否应为have=,因此您可以在该日期获得结果。这似乎是最简单的方法:
select h.*
from historical h
where h.DeltaH = 'ALTF' and
h2.Date < '2019-01-21'
order by h.Date DESC
limit 1
我不确定一个或两个比较是否应该是have=,这样你就可以在那个日期得到结果。草莓,你认为这会比Nick建议的快吗?@quark我想很容易找到谢谢。我刚刚开始,我的测试表只有几百行,所以我现在还不能确定,但是我希望表最终会增长到100-200万条记录。构建一个大型测试表非常容易。草莓,你认为这会比尼克建议的更快吗?@quark我想很容易找到谢谢。我刚刚开始,我的测试表只有几百行,所以我现在还不能确定,但是我希望表最终会增长到100-200万条记录。构建大型测试表非常容易。谢谢Gordon。我正在使用select查询更新另一个表,尝试使用your和Nick的查询,两者的性能大致相同~180秒。我有DeltaH的索引,Date。好奇的是,有没有其他/最佳的方法可以更快地完成这项工作?@Quark。这个答案明确指出了DeltaH,Date上的复合索引,而不是多个索引。抱歉,我应该提到我在DeltaH,Date上有一个复合索引。谢谢Gordon。我正在使用select查询更新另一个表,尝试使用your和Nick的查询,两者的性能大致相同~180秒。我有DeltaH的索引,Date。好奇的是,有没有其他/最佳的方法可以更快地完成这项工作?@Quark。这个答案明确说明了在DeltaH,Date上有一个复合索引,而不是多个索引。抱歉,我应该提到我在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
);