SQL-запрос с рассчитанным динамическим min max - PullRequest
3 голосов
/ 02 декабря 2011

У меня проблема с 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 с данными в ТАБЛИЦЕ Х ДАТА к примерке временные рамки.

Я не могу использовать простой 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

Сначала мне нужно выполнить расчеты со значениями TABLE Y X и Y, а затем мне нужно VALUE Z из таблицы X. Итак, это выглядит так:

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

Есть ли способ сделать это?

спасибо заранее

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Не уверен насчет MySQL, но если вы делаете это с Oracle, я бы использовал аналитическую функцию LEAD , чтобы получить следующее значение даты в будущем в 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 голос
/ 02 декабря 2011

Это простое объединение и группировка по:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...