左加入有效日期

时间:2015-02-06 03:54:08

标签: mysql sql left-join

我有两张桌子。一个表包含事件,另一个表包含一组用户的有效日期。

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

我尝试的另一种方法是在Left Join的ON子句中使用比较运算符,但这不起作用。真的没想到它。

任何建议都将深表感谢!

编辑要求:对于任何事件日期,它需要向后查看并找到事件日期之前的第一个生效日期。如果今天发生的事件是昨天的生效日期和一个月前的生效日期,则应使用昨天的生效日期。

1 个答案:

答案 0 :(得分: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

编辑: 删除了我的加入代码,因为它没有100%正确。