2015-02-06 67 views
1

我有兩張桌子。一個表包含事件,另一個表包含一堆用戶的有效日期。左加入生效日期

user_id | date_effective | rate 
U1  2015-01-01  08.00 
U2  2015-01-01  09.00 
U1  2015-02-01  10.00 
U2  2015-02-01  11.00 
U1  2015-03-01  12.00 

event_id | date_event 
E1   2015-01-15 
E2   2015-02-15 
E3   2015-03-15 

我正在爲特定用戶所附的每個事件以及該用戶的該事件的生效日期提供報告。對於U1,它看起來像這樣。

event_id | date_event | rate 
E1   2015-01-15 08.00 
E2   2015-02-15 10.00 
E3   2015-03-15 12.00 

我想到的生效日期將需要按升序進行排序,所以我可以挑上左連接的第一個,這是默認的行爲。我遇到的問題是,它不會允許我做一個左連接,像這樣的時候訂購的生效日期:

SELECT event.event_id, event.event_date, effective.rate 
FROM event 
LEFT JOIN effective ON effective.user_id=U1 
ORDER BY effective.date_effective ASC 

我嘗試的另一種方法是的ON子句中使用比較運算符左加入,但沒有奏效。沒有真正期待它。

任何建議將深受讚賞!

編輯要求:對於任何事件日期,它需要向後看並找到事件日期之前的第一個生效日期。如果今天發生了昨天生效日期和一個月前生效日期的事件,則應使用昨天的生效日期。

+0

表1中的生效日期必須與給定用戶的表2中的事件日期相匹配嗎? – 2015-02-06 03:56:29

+0

他們不一定匹配。如果您的生效日期爲1月1日和2月1日,則2月1日之前的日期應該使用1月1日生效日期記錄。 – fiddlestacks 2015-02-06 03:57:42

+0

好的,所以月份和年份的有效期和活動日期應該一致?您確實需要澄清要求,因爲您的示例數據並不意味着您在上面解釋的內容。 – 2015-02-06 03:59:37

回答

0

我理解正確嗎? 你想要第一個date_effective給定user_id

隨着子查詢:

SELECT * 
    ,date_effecitve = (SELECT top 1 date_effective 
         FROM effective 
         WHERE user_id = 'U1' 
         AND date_effective <= DATE_event 
         ORDER BY date_effective DESC) 

    ,rate = (SELECT top 1 rate 
      FROM effective 
      WHERE user_id = 'U1' 
       AND date_effective <= DATE_event 
      ORDER BY date_effective DESC) 
FROM event 

結果user_id = U1

event_id date_event date_effective rate 
E1  15.01.2015 01.01.2015  8 
E2  15.02.2015 01.02.2015  10 
E3  15.03.2015 01.03.2015  12 

結果user_id = U2

event_id date_event date_effective rate 
E1  15.01.2015 01.01.2015  9 
E2  15.02.2015 01.02.2015  11 
E3  15.03.2015 01.02.2015  11 

編輯: 刪除了我加入的代碼,因爲它是NOCH 100 %正確。

+0

警告! 'JOIN'版本適用於這些數據,但如果較早的條目具有較高的值(嘗試交換一些條目),將會以無聲和驚人的方式失敗。你正在尋找的是相當於'FIRST()'窗口函數,儘管Mysql本身沒有。你可能有更好的運氣找出一種方法來獲得'date_effective'的(獨有的)上界,這是在常規範圍條件下的連接。 – 2015-02-06 12:29:21

+0

是的,你是對的。我改變這一點。 – Hockenberry 2015-02-06 12:36:47

+0

謝謝,朋友們!這按預期工作,並且我沒有想過! – fiddlestacks 2015-02-18 03:16:49