2016-11-09 2 views
0

У меня проблема с объединением SQL-запроса, который должен показывать мне ближайшую (предыдущую и следующую) дату от CURDATE().SQL-запрос для получения ближайшей предыдущей и следующей даты?

У меня есть таблица с клиентами и таблицы ведьмами событий

таблица с клиентами:

konto_odbiorcy | name 
---------------+---------------- 
2    | Sony LTD 
3    | Panasonic LTD 
etc... 

Это то, что у меня есть в таблице с событиями:

number | date 
-------+------------- 
2  | 2016-11-01 
2  | 2016-11-06 
2  | 2016-11-14 
3  | 2016-11-02 
3  | 2016-11-21 
3  | 2016-11-26 

I необходимо знать, какова последняя минута и следующая ближайшая будущая дата, например:

number | date past | date future 
-------+-------------+------------- 
2  | 2016-11-06 | 2016-11-14 
3  | 2016-11-02 | 2016-11-21 

Как вы видите, для number=3 показать мне 2016-11-21 не 2016-11-26

Когда я хочу показать прошлое ближайшую дату:

SELECT number, date AS past 
FROM 3ce_event 
WHERE date <= CURDATE() 

для следующего события:

SELECT number, date AS future 
FROM 3ce_event 
WHERE date >= CURDATE() 

теперь, как сравнить это два с таблицей моих клиентов в одном запросе SQL?

EDIT

Я изменил мой запрос Майк Ответ:

select 
    number, klienci_ax_all.nazwa, miasto, 
    max(case when date<=curdate() then date end) as date_past, 
    min(case when date>=curdate() then date end) as date_future 
from 3ce_event 
inner join klienci_ax_all on 3ce_event.number = klienci_ax_all.konto_odbiorcy 
group by konto_odbiorcy 

Выглядит очень хорошо, но у меня была проблема с моим клиентам таблицы (klienci_ax_all). Если для одного или нескольких клиентов нет ничего в таблице 3ce_event, у меня нет этого клиента как Null date_past и Null date_future.

Мне нужен полный список клиентов от klienci_ax_all, тогда прошлые и будущие данные, если есть ... любая помощь?

ответ

1
select number, 
     max(case when date<=curdate() then date end) as date_past, 
     min(case when date>=curdate() then date end) as date_future 
    from event 
group by number 
+0

Я отредактировал мое сообщение ... Можете ли вы проверить это? Я думаю, что я возился с опцией JOIN :( –

+0

@ Triple_6 Измените 'INNER JOIN' на' RIGHT JOIN' – Mike

+0

я это знаю :). Большое спасибо за помощь! Теперь это прекрасно. –

1

Один из способов сделать это было бы для себя присоединиться к событиям генерации подмножеств в мин/макс каждой даты для каждой группы ..

SELECT E.Number, E2.LTDate as `Date Past`, E1.GTDate as `Date Future` 
FROM Events E 
LEFT JOIN (SELECT number, min(date) GTDate 
      FROM events 
      WHERE date >= CurDate 
      GROUP BY Number) E1 
on E.Number = E1.Number 
LEFT JOIN (SELECT number, Max(date) LTDate 
      FROM events 
      WHERE date <= CurDate 
      GROUP BY Number) E2 
on E.Number = E2.Number 

Другим способом было бы использовать коррелированные встроенные запросы (Выбрать ж/в избранном), чтобы найти в мин/макс

SELECT E.Number 
    , (Select max(E1.date) from events E1 where E1.Number = E.Number and E1.date<=sysdate) 
    , (Select min(E1.date) from events E2 where E2.Number = E.Number and E2.date>=sysdate) 
FROM Events E 

Я больше вентилятора для 1-го подхода, поскольку он не должен выполнить 3 запроса для каждой записи в таблице событий; однако на меньшем наборе данных второй может быть быстрее.

Смежные вопросы