我有一个费率
表,其中包含每天的每晚费率行。我有一个 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/