连接两个表,其中表 A 具有日期值,并且需要在 B 中查找 A 中日期下方的下一个日期

tyr*_*dis 0 mysql sql greatest-n-per-group

我得到了这张表“A”:

| id | date       |
===================
| 1  | 2010-01-13 |
| 2  | 2011-04-19 |
| 3  | 2011-05-07 |
| .. | ...        |
Run Code Online (Sandbox Code Playgroud)

和这个表“B”:

| date       | value |
======================
| 2009-03-29 | 0.5   |
| 2010-01-30 | 0.55  |
| 2011-08-12 | 0.67  |
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一种方法来联接这两个表,其中“B”中的“值”列映射到“A”中的日期。对我来说,这里棘手的部分是表“B”仅存储更改日期和新值。现在,当我需要表“A”中的这个值时,SQL 需要回顾它要求该值的日期下一个日期是什么。

所以最后这些表的 JOIN 应该如下所示:

| id | date       | value |
===========================
| 1  | 2010-01-13 | 0.5   |
| 2  | 2011-04-19 | 0.55  |
| 3  | 2011-05-07 | 0.55  |
| .. | ...        | ...   |
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Kon*_*rak 5

-- 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 )
Run Code Online (Sandbox Code Playgroud)

我们正在做什么:

  • 对于表中的每个日期id_date(您的表A),
  • 我们在表中找到日期date_val(您的表B
  • 这是表中的最大日期date_val(但仍然小于 id_date.date)