左加入生效日期
Left Join with effective dates
我有两个 table。一个 table 包含事件,另一个 table 包含一群用户的生效日期。
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
我认为生效日期需要按升序排序,这样我就可以在左联接中选择第一个,这是默认行为。我遇到的问题是它不允许我在像这样进行 Left Join 时订购生效日期:
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 子句中使用比较运算符,但没有用。真没想到。
如有任何建议,我们将不胜感激!
编辑 要求:对于任何事件日期,需要向后查找并找到事件日期之前的第一个生效日期。如果今天发生的事件昨天生效,一个月前生效,则应使用昨天的生效日期。
我没听错吗?
您想要给定 user_id
的第一个 date_effective
?
有子查询:
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% 正确的。
我有两个 table。一个 table 包含事件,另一个 table 包含一群用户的生效日期。
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
我认为生效日期需要按升序排序,这样我就可以在左联接中选择第一个,这是默认行为。我遇到的问题是它不允许我在像这样进行 Left Join 时订购生效日期:
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 子句中使用比较运算符,但没有用。真没想到。
如有任何建议,我们将不胜感激!
编辑 要求:对于任何事件日期,需要向后查找并找到事件日期之前的第一个生效日期。如果今天发生的事件昨天生效,一个月前生效,则应使用昨天的生效日期。
我没听错吗?
您想要给定 user_id
的第一个 date_effective
?
有子查询:
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% 正确的。