MySQL-将COALESCE与DATE_ADD和DATE_SUB一起使用以获取下一个/上一个记录

时间:2019-02-10 05:35:57

标签: mysql sql coalesce

我正在尝试查询MySQL以选择上一条和下一条记录。在结合使用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));  

我不能使用主键,因为表中的行将/将被删除。日期列也不一定有固定的日期,我要查找的是下一个较早/较晚的日期。

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()函数返回第一个非null值,但是我无法使用上面的查询使它起作用。我已确认存在2019年1月18日的数据,但尚未选择。你能给些建议么?

我可以使用其他解决方案。

3 个答案:

答案 0 :(得分:1)

您可以使用子查询在表格中查找小于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')

答案 1 :(得分:1)

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';

答案 2 :(得分:1)

这似乎是最简单的方法:

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
);

我不确定一个或两个比较是否应具有=,因此您可以在该日期获得结果。