2011-12-01 21 views
3

我得到了一个sql问题。我有两个表看起来像这样:带有计算动态最小值的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 

我需要assing从数据表Y的所有数据在表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 

首先,我需要与数据表Y值X的Y和之后,我需要为Z 从表X.所以看起来进行计算这个:

ID | DATE | Calculated_Val 
4711| 15.01 | 345 
4711| 20.01 | 892 

有没有办法做到这一点?

提前

回答

1

THX这是一个简单的加入和group by:

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 
2

不知道有关MySQL,但如果你是与甲骨文这样做,我会使用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)) 

请注意,我没有修改日期的下一个值,以便使用低于条件我。如果您在任何日期字段中都有时间组件,但如果它们只是日期值,可能不完全符合您的要求。