mysql - 将临时日期表与两个表合并并填充缺失值?

标签 mysql join

我有一个费率表,其中包含每天的每晚费率行。我有一个 ratecodes 表,其中包含映射到 rates 的不同费率代码。

我的目标是找到 X 段时间内任意日期缺失的费率。在本示例中,我们使用 1 个月。

期望结果:64行,其中2行填充有第一费率代码的信息。第二个费率代码在 rates 中绝对没有行,但我需要表明它实际上缺少日期。 (64,因为从现在起 1 个月后返回 32 天 x 2 个费率代码)

有问题的两个表:

CREATE TABLE `ratecode` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ratecode` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


INSERT INTO `ratecode` VALUES ('1', 'BLAH');
INSERT INTO `ratecode` VALUES ('2', 'NAH');


CREATE TABLE `rates` (
  `thedate` date DEFAULT NULL,
  `rate` double DEFAULT NULL,
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ratecode` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


INSERT INTO `rates` VALUES ('2014-12-27', '999', '1', '1');
INSERT INTO `rates` VALUES ('2014-12-26', '99', '2', '1');

所以使用这个查询,分为两部分。第 1 部分是从今天到 future 1 个月的临时日期表:

CREATE TEMPORARY TABLE IF NOT EXISTS `myDates` AS (

SELECT 

CAST((SYSDATE()+INTERVAL (H+T+U) DAY) AS date) d

FROM ( SELECT 0 H
    UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300
  ) H CROSS JOIN ( SELECT 0 T
    UNION ALL SELECT  10 UNION ALL SELECT  20 UNION ALL SELECT  30
    UNION ALL SELECT  40 UNION ALL SELECT  50 UNION ALL SELECT  60
    UNION ALL SELECT  70 UNION ALL SELECT  80 UNION ALL SELECT  90
  ) T CROSS JOIN ( SELECT 0 U
    UNION ALL SELECT   1 UNION ALL SELECT   2 UNION ALL SELECT   3
    UNION ALL SELECT   4 UNION ALL SELECT   5 UNION ALL SELECT   6
    UNION ALL SELECT   7 UNION ALL SELECT   8 UNION ALL SELECT   9
  ) U

WHERE
  (SYSDATE()+INTERVAL (H+T+U) DAY) <= (SYSDATE()+INTERVAL 1 MONTH)

ORDER BY d ASC

);

第 2 部分是正在进行的实际选择:

SELECT
*

FROM
rates


RIGHT JOIN myDates ON ( myDates.d = rates.thedate )
LEFT OUTER JOIN ratecode ON ( rates.ratecode = ratecode.id )

这仅返回 32 行,因为在 rates 中,ratecode 中的第一个条目有 2 条记录。我没有找回其他费率代码缺失的 32 行。我该如何调整才能保留这些信息?

取回 64 行后,我还需要过滤哪些行是“空白”或尚未输入费率。因此仅缺少值。

最佳答案

如果我理解正确,您希望使用交叉联接生成所有行,然后左联接到数据并过滤掉所有匹配项:

select rc.ratecode, d.d as missingdate
from ratecode rc cross join
     mydates d left join
     rates r
     on rc.id = r.ratecode and d.d = r.thedate
where r.id is null;

关于mysql - 将临时日期表与两个表合并并填充缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516814/

相关文章:

mysql - SQL - 来自 3 个表的结果,聚合函数

join - KDB 反向 asof join (aj) 即在下一个引用而不是上一个引用

MySQL 连接操作以获取有关帖子的信息以及撰写​​该帖子的用户名

php - 从 mysql 选择表时编码错误

mysql - 减法 mysql vb net

javascript - 我可以缩短这个脚本吗? (更新数据库表并刷新)

php - ORDER BY RAND() 用于多列(垂直排列每列的内容)

多个表的 SQL INNER JOIN 等于 WHERE 语法

mysql - SQL "chained"查询?

java - Oracle TO_DATE 函数在 Mysql 中并行,它应该同时支持 DB oracle 和 mysql