Соедините две таблицы, где таблица A имеет значение даты и должна найти следующую дату в B ниже даты в A - PullRequest
0 голосов
/ 09 декабря 2011

Я получил эту таблицу "A":

| id | date       |
===================
| 1  | 2010-01-13 |
| 2  | 2011-04-19 |
| 3  | 2011-05-07 |
| .. | ...        |

и эту таблицу "B":

| date       | value |
======================
| 2009-03-29 | 0.5   |
| 2010-01-30 | 0.55  |
| 2011-08-12 | 0.67  |

Теперь я ищу способ объединить эти две таблицы, имеющиестолбец «значение» в «B» сопоставлен с датами в «A».Самое сложное для меня в том, что в таблице «B» хранятся только дата изменения и новое значение.Теперь, когда мне нужно это значение в таблице «А», SQL нужно посмотреть, какая дата следующая ниже даты, для которой оно запрашивает значение.

Таким образом, в итоге соединение этих таблиц должно выглядеть следующим образомэто:

| id | date       | value |
===========================
| 1  | 2010-01-13 | 0.5   |
| 2  | 2011-04-19 | 0.55  |
| 3  | 2011-05-07 | 0.55  |
| .. | ...        | ...   |

Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 09 декабря 2011
-- Create and fill first table
CREATE TABLE `id_date` (
  `id` int(11) NOT NULL auto_increment,
  `iddate` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `id_date` VALUES(1, '2010-01-13');
INSERT INTO `id_date` VALUES(2, '2011-04-19');
INSERT INTO `id_date` VALUES(3, '2011-05-07');

-- Create and fill second table    
CREATE TABLE `date_val` (
  `mydate` date NOT NULL,
  `myval` varchar(4) collate utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `date_val` VALUES('2009-03-29', '0.5');
INSERT INTO `date_val` VALUES('2010-01-30', '0.55');
INSERT INTO `date_val` VALUES('2011-08-12', '0.67');

-- Get the result table as asked in question
SELECT iddate, t2.mydate, t2.myval
FROM `id_date` t1
JOIN date_val t2 ON t2.mydate <= t1.iddate
AND t2.mydate = ( 
SELECT MAX( t3.mydate ) 
FROM `date_val` t3
WHERE t3.mydate <= t1.iddate )

Что мы делаем:

  • для каждой даты в таблице id_date (ваша таблица A),
  • мы находим дату вdate_val таблица (ваша таблица B)
  • , которая является самой высокой датой в таблице date_val (но все же меньше, чем id_date.date)
2 голосов
/ 09 декабря 2011

Вы можете использовать подзапрос с limit 1, чтобы найти последнее значение в таблице B:

select  id
,       date
,       (
        select  value
        from    B
        where   B.date < A.date
        order by
                B.date desc
        limit   1
        ) as value
from    A
0 голосов
/ 09 декабря 2011

INNER JOIN возвращает строки, если в обеих таблицах есть хотя бы одно совпадение.Попробуйте это.

Select A.id,A.date,b.value 
from A inner join B 
on A.date=b.date 
...