我遇到了一个 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
我需要将 TABLE Y 中的所有数据与 TABLE X DATE 中的数据关联起来 时间框架。
我不能使用简单的最小值 - 最大值,因为它会改变。
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
首先,我需要使用 TABLE Y VALUES X 和 Y 进行计算,然后我需要 VALUE Z 来自表 X。所以它看起来像这样:
ID | DATE | Calculated_Val
4711| 15.01 | 345
4711| 20.01 | 892
有没有办法做到这一点?
提前谢谢
最佳答案
不确定 MySQL,但如果您使用 Oracle,我会使用 LEAD
analytic function获取 tableX 中 future 的下一个日期值,然后将其加入 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))
请注意,我没有修改日期的下一个值,所以我使用的是小于条件。如果您在任何日期字段中都有时间组件,这可能是合适的,但如果它们只是日期值,则可能不是您想要的。
关于mysql - 具有计算的动态最小最大值的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348911/