MySQL的 - 使用COALESCE与DATE_ADD和DATE_SUB获得下/上一纪录

问题描述 投票:0回答:3

我想查询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);

上面的查询似乎工作,但我需要查询间隔1天,以防日期不存在转会间隔2天....

 select * from `Historical` where `DeltaH` = 'ALTF' and `Date`= 
 DATE_SUB('2019-01-21', INTERVAL COALESCE(1,2,3,4,5) DAY);

这一次也不行。据我所知,COALESCE()函数返回第一个非空值,但是我没有能够得到它使用上面的查询工作。我已确认存在2019年1月18日的数据,但没有被选中。你能给些建议么?

我与使用替代解决方案确定。

mysql sql coalesce
3个回答
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
投票

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

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

我不知道,如果一个或两个比较,应该是有=,这样你就可以在该日期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.