Как выбрать истечение ближайшего месяца в mySQL

0
Date    Expiry  Close
20-Mar-18   28-Mar-18   10143.2
20-Mar-18   26-Apr-18   10180.2
20-Mar-18   31-May-18   10201
21-Mar-18   28-Mar-18   10180.2
21-Mar-18   26-Apr-18   10218.3
21-Mar-18   31-May-18   10237.8
22-Mar-18   28-Mar-18   10127.8
22-Mar-18   26-Apr-18   10168.8
22-Mar-18   31-May-18   10193.2
23-Mar-18   28-Mar-18   10003.9
23-Mar-18   26-Apr-18   10047.6
23-Mar-18   31-May-18   10060.2
26-Mar-18   28-Mar-18   10146.2
26-Mar-18   26-Apr-18   10178.3
26-Mar-18   31-May-18   10205
27-Mar-18   28-Mar-18   10179
27-Mar-18   26-Apr-18   10215.8
27-Mar-18   31-May-18   10235.2
28-Mar-18   28-Mar-18   10120.2
28-Mar-18   26-Apr-18   10152
28-Mar-18   31-May-18   10175.3
2-Apr-18    28-Jun-18   10301.4
2-Apr-18    31-May-18   10288.2
2-Apr-18    26-Apr-18   10264
3-Apr-18    26-Apr-18   10285
3-Apr-18    31-May-18   10313.9
3-Apr-18    28-Jun-18   10327.4
4-Apr-18    26-Apr-18   10146.6
4-Apr-18    31-May-18   10175.5
4-Apr-18    28-Jun-18   10194.7
5-Apr-18    26-Apr-18   10352.2
5-Apr-18    31-May-18   10381
5-Apr-18    28-Jun-18   10398
6-Apr-18    28-Jun-18   10399.3
6-Apr-18    31-May-18   10385.1
6-Apr-18    26-Apr-18   10352.8

Каждая из дат в первом столбце имеет три срока действия, связанные с ним. Я хочу получить Date, Close, Expiry только для истечения срока действия, который ближе всего к дате (истекает месяц истечения срока действия). Как мне это сделать? Спасибо.

Например, я хочу, чтобы результат был следующим:

Date    Expiry  Close
20-Mar-18   28-Mar-18   10143.2
21-Mar-18   28-Mar-18   10180.2
22-Mar-18   28-Mar-18   10127.8
23-Mar-18   28-Mar-18   10003.9
26-Mar-18   28-Mar-18   10146.2
27-Mar-18   28-Mar-18   10179
28-Mar-18   28-Mar-18   10120.2
2-Apr-18    26-Apr-18   10264
3-Apr-18    26-Apr-18   10285
4-Apr-18    26-Apr-18   10146.6
5-Apr-18    26-Apr-18   10352.2
6-Apr-18    26-Apr-18   10352.8
  • 0
    Можете ли вы вдаваться в подробности? Прямо сейчас твой вопрос мне не понятен.
  • 0
    Я добавил, что я пытаюсь сделать
Показать ещё 1 комментарий
Теги:

4 ответа

0
Лучший ответ

Я нашел решение. Проводя его здесь для других:

SELECT Date, DATE_FORMAT(min(STR_TO_DATE(Expiry, '%d-%b-%Y' )),"%d-%b-%Y") Expiry, Close
FROM table
WHERE Symbol =  'NIFTY'
GROUP BY Date
order by STR_TO_DATE(DATE,  '%d-%b-%Y' )

Предложение WHERE является дополнительным, так как в моей таблице также много символов.

Что он делает, он сортирует Expiry сначала перед группировкой с Date и снова результат сортируется от старейшего до новейшего Date

Любые предложения по улучшению более чем приветствуются :)

0

Я думаю, что luksch последующий, пожалуйста, попробуйте следующее:

 SELECT 
     Date, 
     Expiry, 
     Close,
     DATEDIFF(Expiry, Date) DaysToExpire

 FROM
     table
 GROUP BY 
     Date 
 ORDER BY
     DaysToExpire DESC
  • 0
    Благодарю. Тем не менее, предполагается, что экспирации уже отсортированы, что не так.
  • 0
    На самом деле это не предполагает, что Expiry отсортирован. Вот почему DATEDIFF рассчитывается и используется для
Показать ещё 1 комментарий
0

Вы можете попробовать что-то вроде

SELECT t.'date' , t.'expiry', t.'close' FROM 
test t INNER JOIN (
    SELECT 'date', MIN(expiry) AS minD FROM test WHERE 'expiry'>'date' GROUP BY 'date'
) AS minDate
ON t.'date' = minDate.date AND t.'expiry' = minDate.minD;
  • 0
    @ Расти Бэнкс, ты получил свое решение?
0

Не тестировали, я думаю, что в MariaDB это работает. Попробуйте следующее:

SELECT
    Date,
    Expiry,
    Close
FROM
    table
GROUP BY
    Date
ORDER BY
    Expiry DESC
  • 0
    Это работает только в том случае, если даты «Expiry» всегда больше, чем «Date», но, похоже, это имеет место в примере с OP. Если нет, то вы можете взять (абсолютную) разницу дат и срока действия и упорядочить их.
  • 0
    Спасибо за это, но иногда он прерывается, так как Дата истечения не всегда сортируется. Он дает только первый срок действия, который он находит. Я пытаюсь получить дату с ближайшим значением срока действия. Например: если Дата = 6 апреля 18 и значения Expiry равны 28 июня 2018 года, 31 мая 2018 года и 26 апреля 2018 года, то срок действия истекает как 28 июня 2018 года вместо 26 апреля 2018 года.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню