Assessments table:
+---------------+-----------+---------------------+
| assessment_id | device_id | created_at |
+---------------+-----------+---------------------+
| 1 | 1 | 2022-07-15 20:03:03 |
| 2 | 2 | 2022-07-15 21:03:03 |
| 3 | 1 | 2022-07-15 22:03:03 |
| 4 | 2 | 2022-07-15 23:03:03 |
| 5 | 2 | 2022-07-15 23:03:03 |
+---------------+-----------+---------------------+
Results table:
+---------------+---------+--------+
| assessment_id | test | result |
+---------------+---------+--------+
| 1 | A | PASS |
| 2 | B | FAIL |
| 3 | A | FAIL |
| 4 | B | PASS |
| 5 | B | PASS |
+---------------+---------+--------+
Objective
每次test_id
中的result
个改变时,我都要返回一行.
例如,设备1具有判断1和3.判断1中的测试A通过,判断3中的测试A失败,因此我们希望将此更改作为一行返回.
设备2具有判断2、4和5.判断2和4中的测试结果发生了更改(测试B从失败更改为通过),我们想为此返回一行.
我们不想为判断5返回一行,因为测试B通过了,并且在判断4中也通过了.没有变化.
生成的表如下所示:
+-----------+---------+------------------------+----------------+----------------------+--------------------+------------+----------------------+
| device_id | test_id | previous_assessment_id | previous_value | previous_value_date | next_assessment_id | next_value | next_value_date |
+-----------+---------+------------------------+----------------+----------------------+--------------------+------------+----------------------+
| 1 | A | 1 | PASS | 15/07/2022 20:03:03 | 3 | FAIL | 15/07/2022 22:03:03 |
| 2 | B | 2 | FAIL | 15/07/2022 21:03:03 | 4 | PASS | 15/07/2022 23:03:03 |
+-----------+---------+------------------------+----------------+----------------------+--------------------+------------+----------------------+
我试过处理几个查询,找到了here on SO个,但它们要么花费了很长时间并返回了错误的数据,要么根本不起作用.我不认为这是重复的,因为我使用了多个表,而我看到的每个其他问题都涉及一个表.
我也看了this SO question个,但没有得到适用于我的情况的有用答案.
我在使用SQL Fiddle时遇到了一些奇怪的问题,但下面是我一直在修补的测试模式:
CREATE TABLE `assessments` (
`id` int,
`device_id` int,
`created_at` datetime
);
INSERT INTO `so_assessments` (`id`, `device_id`, `created_at`) VALUES (1, 1, '2022-07-09 22:56:00');
INSERT INTO `so_assessments` (`id`, `device_id`, `created_at`) VALUES (2, 2, '2022-07-10 22:56:06');
INSERT INTO `so_assessments` (`id`, `device_id`, `created_at`) VALUES (3, 1, '2022-07-11 22:56:11');
INSERT INTO `so_assessments` (`id`, `device_id`, `created_at`) VALUES (4, 2, '2022-07-12 22:56:17');
INSERT INTO `so_assessments` (`id`, `device_id`, `created_at`) VALUES (5, 2, '2022-07-13 22:56:24');
CREATE TABLE `results` (
`assessment_id` int,
`test` enum('A','B'),
`result` enum('PASS','FAIL')
);
INSERT INTO `results` (`assessment_id`, `test`, `result`) VALUES (1, 'A', 'PASS');
INSERT INTO `results` (`assessment_id`, `test`, `result`) VALUES (2, 'B', 'FAIL');
INSERT INTO `results` (`assessment_id`, `test`, `result`) VALUES (3, 'A', 'FAIL');
INSERT INTO `results` (`assessment_id`, `test`, `result`) VALUES (4, 'B', 'PASS');
INSERT INTO `results` (`assessment_id`, `test`, `result`) VALUES (5, 'B', 'PASS');