我遇到了一个sql问题。我有两个看起来像这样的表:
first TABLE X second TABLE Y
TabX_ID| DATE | Value Z TabY_ID|TabX_ID | DATE | Value X | Value Y
4711 | 15.01 | 12 1 | 4711 | 15.01| 123 | 876
4711 | 20.01 | 5 2 | 4711 | 16.01| 12 | 54
4711 | 25.01 | 67 3 | 4711 | 17.01| 23 | 38
4 | 4711 | 20.01| 56 | 13
5 | 4711 | 23.01| 1 | 5
我需要将表Y中的所有数据分配到表X DATE中的数据到拟合 时间表。
我不能使用简单的min - max,因为它会改变。
1. DATE min 15.01 DATE-max:19.01
2. DATE-min:20.01 DATE-max:24.01
3. DATE-min:25.01 DATE-max:...
所以看起来像这样
1 | 15.01 | 123 | 876
4711 | 15.01 | 12 -> 2 | 16.01 | 12 | 54
3 | 17.01 | 23 | 38
4711 | 20.01 | 5 -> 4 | 20.01 | 56 | 13
5 | 23.01 | 1 | 5
首先,我需要使用表Y值X和Y执行计算,然后我需要VALUE Z. 来自表X.所以它看起来像这样:
ID | DATE | Calculated_Val
4711| 15.01 | 345
4711| 20.01 | 892
有办法做到这一点吗?
事先提前答案 0 :(得分:2)
不确定MySQL,但如果您使用Oracle进行此操作,我会使用LEAD
analytic function在tableX中获取未来的下一个日期值,然后将其加入tableY。
这方面的一个例子是:
select
tabX_id,
date_val as min_date,
next_date_val as max_date,
valueZ,
valueX,
valueY,
y.date_val as tabY_date
from (
select
tabX_id,
date_val,
lead(date_val) over (partition by tabx_id order by date_val)
as next_date_val,
valueZ
from tabX
) x
join tabY y on (x.tabX_id = y.tabX_id and
y.date_val >= x.date_val and
(x._next_date_val is null or y.date_val < x.next_date_val))
请注意,我没有修改日期的下一个值,因此使用的是小于条件。如果您在任何日期字段中都有时间组件,但如果它们只是日期值,则可能不完全符合您的要求,这可能是合适的。
答案 1 :(得分:1)
这是一个简单的连接和分组:
select x.TabX_ID, y.DATE, min(ValueX), min(ValueY)
from TableX x
join TableY y
on x.TabX_ID = y.TabX_ID
and x.DATE = y.DATE
group by x.TabX_ID, y.DATE