2016-11-09 45 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 

我需要知道什麼是最近的過去日期和下一個最近的未來日期,如:

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

正如你看到的,對於number=3告訴我2016-11-212016-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查詢?

編輯

我改變了我的查詢邁克答案:

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 

另一種方法是使用相關聯的查詢(選擇W /在選擇)找到最小/最大

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 

我多爲第一次的做法風扇的,因爲它不具備執行3個查詢在事件表中的每個記錄;但是對於較小的數據集,第二個數據集可能會更快。

相關問題