【发布时间】:2017-12-03 04:48:16
【问题描述】:
这是SQL Fiddle,我用我在下面讨论的所有内容创建,但此查询将专门设置为仅查询同一天的记录,例如2017-11-29 所以这个例子就足够了。
我有两个数据表
当我在 BTR 表中只有一个特定日期的值时,我总是会得到预期的结果(即,1 of 25、2 of 25 总是如此)。
当一天中有多个“要运行的批次”记录集(根据示例数据)并且其值被重置为另一个有效值但同一天具有不同且更新的时间戳时,
问题
如何明智地防止加入比较新/当前/最新 BTR 记录时间戳更旧的 BC 记录,以防止无效结果 SQL Fiddle 我提供的示例在 2017-11-29T13:59:59Z 时间的记录处启动此问题戳 (TimeStr)?
我不希望 BC 表中的旧记录与 BTR 表中的下一个/较新/最新时间戳记录匹配,并希望它根据时间移动到下一个真实记录值,以便在存在较新的 BTR 记录时,在下一个新记录之前,不要看任何小于那个时间的东西。
原始 SQL
创建表格并插入数据
CREATE TABLE `batchestorun` (
`TimeInt` varchar(10) NOT NULL,
`TimeStr` datetime NOT NULL,
`IsInitValue` int(11) NOT NULL,
`Value` int(11) NOT NULL,
`IQuality` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeInt`,`TimeStr`)
);
CREATE TABLE `batchescomplete` (
`TimeInt` varchar(10) NOT NULL,
`TimeStr` datetime NOT NULL,
`IsInitValue` int(11) NOT NULL,
`Value` int(11) NOT NULL,
`IQuality` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeInt`,`TimeStr`)
);
## BTR
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511917564','2017-11-29 01:06:04',1,0,0);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511938976','2017-11-29 07:02:56',0,21,3);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511962086','2017-11-29 13:28:06',0,0,3);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511962089','2017-11-29 13:28:09',0,1,3);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511962979','2017-11-29 13:42:59',0,20,3);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511971912','2017-11-29 16:11:52',0,0,3);
INSERT INTO `batchestorun` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511971934','2017-11-29 16:12:14',0,25,3);
## BC
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511917564','2017-11-29 01:06:04',1,0,0);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511939767','2017-11-29 07:16:07',0,1,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511940230','2017-11-29 07:23:50',0,2,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511940692','2017-11-29 07:31:32',0,3,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511942121','2017-11-29 07:55:21',0,4,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511944099','2017-11-29 08:28:19',0,5,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511945511','2017-11-29 08:51:51',0,6,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511947447','2017-11-29 09:24:07',0,7,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511948408','2017-11-29 09:40:08',0,8,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511949620','2017-11-29 10:00:20',0,9,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511951571','2017-11-29 10:32:51',0,10,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511952520','2017-11-29 10:48:40',0,11,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511953011','2017-11-29 10:56:51',0,12,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511953960','2017-11-29 11:12:40',0,13,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511954905','2017-11-29 11:28:25',0,14,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511955860','2017-11-29 11:44:20',0,15,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511956351','2017-11-29 11:52:31',0,16,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511959198','2017-11-29 12:39:58',0,17,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511960194','2017-11-29 12:56:34',0,18,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511960731','2017-11-29 13:05:31',0,19,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511961677','2017-11-29 13:21:17',0,20,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511962086','2017-11-29 13:28:06',0,0,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511962849','2017-11-29 13:40:49',0,1,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511963999','2017-11-29 13:59:59',0,2,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511965321','2017-11-29 14:22:01',0,3,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511971912','2017-11-29 16:11:52',0,0,3);
INSERT INTO `batchescomplete` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1511971935','2017-11-29 16:12:15',0,1,3);
加入查询
SELECT
IF(btr.TimeStr<= bc.TimeStr, CONCAT(bc.Value," of ",btr.Value), '') Batch
, bc.TimeStr
FROM BatchesComplete bc
INNER JOIN BatchesToRun btr ON btr.TimeStr <= bc.TimeStr
WHERE btr.Value >1 AND bc.Value >0 AND btr.IQuality = 3;
#SELECT * FROM batchestorun;
#SELECT * FROM batchescomplete;
#SELECT * FROM batchestorun WHERE Value >1;
#SELECT * FROM batchescomplete WHERE Value >0;
预期结果示例
因此,根据SQL Fiddle 中的结果集,我提供了从第一行的1 of 21 到第20 行的20 of 21 的Batch 列记录都是正确的。
之后的行与20 的下一个BTR 表Value 字段何时起作用相关,结果显示2017-11-29 13:59:59 "BC" Value 字段与以前的“BTR”和新的“BTR”两者。
虽然同时获得2 of 20 和2 of 21,但我需要它只显示2 of 20 以获得下一个/较新的“BTR”值,而不是回头看并加入任何旧记录最新“BTR”表Value记录的TimeStr。
另一个预期结果示例
所以在我的示例中的前 20 条记录之后,我希望结果 看起来像这样 - 越近越好,但我什至可以掀起一些东西 如果你能帮我搞定一些事情。
表关系
【问题讨论】:
-
我在此查询中提到“ 值”我指的是实际的
Value字段,以防有人想知道我想提一下,如果我的意思仅针对该领域进行记录。 -
这两个表(BC 和 BTR)是如何链接的?你能显示你用来加入它们的 SQL 接近你想要的吗?
-
@ChrisCarr 这些表是按照我提供的sqlfiddle.com/#!9/e94b86/6 示例中的
TimeStr连接的。在这种情况下,没有键或类似的东西,并且关系是表到表,并且数据从这些表中链接到TimeStr列条件。 -
@ChrisCarr 此外,这个sqlfiddle.com/#!9/e94b86/31 可以帮助您查看 JOIN 条件中的所有数据(如果有帮助的话)。有人说要使用
GROUP BY,然后删除了答案,所以我尝试了但看起来不对,当我回去检查时,答案被删除了。