MySQL - использование COALESCE с DATE_ADD и DATE_SUB для получения следующей / предыдущей записи - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь запросить 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,если дата не существует, перейдите в ИНТЕРВАЛ 2 ДНЯ ....

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

Эта также не работает.Я понимаю, что функция COALESCE () возвращает первое ненулевое значение, однако я не могу заставить его работать, используя приведенный выше запрос.Я подтвердил, что данные существуют для 2019-01-18, но не выбираются.Вы могли бы посоветовать?

Я согласен с использованием альтернативного решения.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

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';
0 голосов
/ 10 февраля 2019

Кажется, что это самый простой метод:

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

Я не уверен, что одно или оба сравнения должны иметь =, поэтому вы можете получить результаты в эту дату.

0 голосов
/ 10 февраля 2019

Вы можете использовать подзапрос, чтобы найти самую последнюю дату в таблице, которая меньше 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')
...