2011-12-01 57 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)) 

請注意,我沒有修改日期的下一個值,以便使用低於條件我。如果您在任何日期字段中都有時間組件,但如果它們只是日期值,可能不完全符合您的要求。