- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
+---------------+-----------+---------------------+
| 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 |
+---------------+-----------+---------------------+
+---------------+---------+--------+
| assessment_id | test | result |
+---------------+---------+--------+
| 1 | A | PASS |
| 2 | B | FAIL |
| 3 | A | FAIL |
| 4 | B | PASS |
| 5 | B | PASS |
+---------------+---------+--------+
我希望每次 test_id
的结果
发生变化时返回一行。
例如,设备 1 有评估 1 和 3。评估 1 中的测试 A 通过,评估 3 中的测试 A 失败,因此我们希望将此更改作为一行返回。
设备 2 有评估 2、4 和 5。评估 2 和 4 中的测试结果发生变化(测试 B 从 FAIL 更改为 PASS),我们希望为此返回一行。
我们不想返回评估 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');
最佳答案
如果您使用的是 MySQL 8,窗口函数可以提供帮助。 https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
您可以按设备
和测试
对结果进行分区,并添加一个作为结果<的先前值的列
,然后使用结果与先前值不同的最后一行。
以下查询使用 previous_value
在结果中创建一个新列
SELECT
assessment_id,
device_id,
test,
result,
LAG (result) over w as `previous_value`,
LAG (assessment_id) over w as `previous_assessment_id`
FROM assessments join results using(assessment_id)
WINDOW w AS (PARTITION BY device_id, test ORDER BY assessment_id)
产生结果:
+---------------+-----------+------+--------+----------------+------------------------+
| assessment_id | device_id | test | result | previous_value | previous_assessment_id |
+---------------+-----------+------+--------+----------------+------------------------+
| 1 | 1 | A | PASS | NULL | NULL |
| 3 | 1 | A | FAIL | PASS | 1 |
| 2 | 2 | B | FAIL | NULL | NULL |
| 4 | 2 | B | PASS | FAIL | 2 |
| 5 | 2 | B | PASS | PASS | 4 |
+---------------+-----------+------+--------+----------------+------------------------+
这是战斗的重要组成部分。现在我们需要获取该结果并找到具有最高assessment_id 的每个设备/测试对的行,其中 result != previous_value。
窗口是在GROUP BY
、ORDER BY
甚至HAVING
之后计算的,因此没有太多可以做的事情查询(我想到的)将其范围缩小到每个设备/测试对的最新条目。所以上面必须是一个子查询才能得到最终结果。
注意:我假设如果结果永远不会改变,您希望显示第一次记录结果的时间。换句话说,您希望以 previous_value = NULL
作为转换来计算结果。
以下查询列出了设备/测试对的测试结果更改的所有时间:
SELECT * FROM
(SELECT
assessment_id,
device_id,
test,
result,
LAG (result) over w as `previous_value`
FROM assessments join results using(assessment_id)
WINDOW w AS (PARTITION BY `device_id`, `test` ORDER BY `assessment_id`)
) AS t
WHERE result != `previous_value` OR `previous_value` IS NULL
获取结果(出于空间考虑,我省略了 previous_assessment_id
和其他内容):
+---------------+-----------+------+--------+----------------+
| assessment_id | device_id | test | result | previous_value |
+---------------+-----------+------+--------+----------------+
| 1 | 1 | A | PASS | NULL |
| 3 | 1 | A | FAIL | PASS |
| 2 | 2 | B | FAIL | NULL |
| 4 | 2 | B | PASS | FAIL |
+---------------+-----------+------+--------+----------------+
编辑
这就是问题的答案。如果第一次设置值不感兴趣,只需删除 WHERE 子句的 OR
部分即可。这个答案的其余部分是因为我说服自己问题是获取值翻转的最近时间。我把它留在这里,但只是为了兴趣。
继续
这是结果与之前不同的所有时间,加上第一次记录结果的时间。快到了。
此时很容易在外部查询中添加另一个窗口来聚合上面的行并识别正确的行。但至少在 MySQL 8 中,不支持嵌套窗口。
但鉴于该结果,我们可以使用 MAX()
和 GROUP BY
创建一个查询,给出我们最终想要的所有行的assessment_ids:
SELECT MAX(assessment_id)
FROM (
SELECT
assessment_id,
device_id,
test,
result,
LAG (result) over w as `previous_value`,
LAG (assessment_id) over w as `previous_assessment_id`
FROM assessments join results using(assessment_id)
WINDOW w AS (PARTITION BY device_id, test ORDER BY assessment_id)
) AS t
where result != previous_value OR previous_value IS NULL
GROUP BY device_id, test
其产量:
+--------------------+
| MAX(assessment_id) |
+--------------------+
| 3 |
| 4 |
+--------------------+
现在我们确切地知道我们需要哪些行;但是我们构建了有关先前值的所有数据,现在我们需要一种方法将该查询的结果与子查询的结果连接起来。
令人高兴的是,MySQL 8 有一种方法来存储查询并多次使用它,称为公共(public)表表达式,它使用 WITH
子句 docs here 。因此,我们可以创建包含所有有趣数据的表,然后将其用作子查询来获取我们最终想要的 id,然后将其与我们刚刚创建的结果连接起来:
WITH
transitions AS (SELECT
assessment_id,
device_id,
test,
result,
LAG (result) over w as `previous_value`,
LAG (assessment_id) over w as `previous_assessment_id`
FROM assessments join results using(assessment_id)
WINDOW w AS (PARTITION BY device_id, test ORDER BY assessment_id)
)
SELECT transitions.*
FROM transitions
JOIN (
SELECT MAX(assessment_id) as assessment_id
FROM transitions
WHERE result != previous_value OR previous_value IS NULL
GROUP BY device_id, test
) AS t2 using (assessment_id)
给我们最终答案(以及您可以填写的其他列):
+---------------+-----------+------+--------+----------------+------------------------+
| assessment_id | device_id | test | result | previous_value | previous_assessment_id |
+---------------+-----------+------+--------+----------------+------------------------+
| 3 | 1 | A | FAIL | PASS | 1 |
| 4 | 2 | B | PASS | FAIL | 2 |
+---------------+-----------+------+--------+----------------+------------------------+
第一部分创建一个数据集,其中包含有关每次测试之前发生的情况的所有信息。然后我们编写一个查询来获取该查询中感兴趣的行的 id,然后我们连接回到原始数据集以填充所有列。
关于mysql - 当每组的列值发生变化时选择并连接行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73000024/
嘿伙计们。 实现背景变化(基本上是幻灯片放映)和过渡效果的常见方法有哪些。我想每隔一段时间改变complte文档背景。 我是一名 ASP.net 开发人员,并且希望大部分内容都可以在 ASP 中实现。
也许,指针已经在修改过程中指向 auto_ptr 的常规指针指向 unique_ptr 和 shared_ptr 我只是想知道已经开发出来的新型指针是否完全覆盖了旧版本(或者您可能认为存在内存泄漏问题
我使用 Android Studio 构建 Android 应用。 我的问题是:当 fragment 改变时,应用程序崩溃。 控制台输出[控制台] 01-06 18:35:21.952 27756-
****澄清**我做了这个 [Fiddle] ( http://jsfiddle.net/sggPv/10/ ) 来帮助澄清情况。 该脚本起初适用于两个表格,但随后当您点击 slider 并将新表格加
我有图标,单击它会将新的 div(列)添加到 div 容器。问题是,当新的 div(列)出现时,按钮不会向右移动。是否可以以某种方式仅在 div 内添加 position:fixed? 这是我的几个屏
我是 Java 新手,继承了现有的 Android 应用程序。原始开发人员选择使用常量接口(interface)。 我的问题是我需要更改其中一些常量来编译生产应用程序与开发应用程序。如果我手动修改一些
在 Apple developer Document 中,我在 UIColor 中发现了一些新东西。 If your app was linked on or after iOS 10 and whe
我没有经常使用 ShareKit,但我只想拥有三个共享选项:Facebook、Twitter 和电子邮件。 ShareKit 提供了更多选项,包括更多按钮。但是,我不想要“更多”选项,只想要三个。 在
我正在构建一个 JS 库,其中一个用例要求我在 DOM 更改时触发一个事件,特别是如果它是一个单页应用程序,例如:github search bar 经过一番研究,我遇到了MutationObserv
我已经设法编写了一个代码来检测任何工作表中特定单元格的值变化,但我一直在努力构建检测和跟踪范围(值)变化的东西。 例如,如果用户决定复制和粘贴某个范围的数据(假设超过 1 个单元格),它不会被宏捕获。
使用 ffmpeg ,我们可以对音频电平进行多少控制?例如,我想在程序的时间轴上映射一个“M”形: t0 - t1 : fade in from 0 to 1 t1 - t2 : play at fu
使用 jQuery 1.7.1,我尝试为下拉列表上的更改事件创建一个事件处理程序。下拉列表会动态添加到 DOM 中。似乎在大多数浏览器上都能很好地工作,但是哦,奇怪的 IE8 想要变得困难。有解决方法
我想制作一个具有可选边框大小的自定义控件。请参阅下面的代码。边框绘制在非客户区,其宽度可以是 0、1 或 2 像素。我已经在 WM_NCPAINT 中成功完成了边框绘制。问题是,在更改控制边框大小的属
我知道这个问题之前已经被问过,而且我实际上已经找到了一些我已经实现的解决方案。不幸的是,我没能得到我想要的。 我以前没有做过AngularJS,我想做的是: 检测网址何时更改 根据网址更改的内容进行一
我有一个 auto-carousel 指令,它循环访问链接元素的子元素。 但是,子级尚未加载到 DOM 中,因为它们的 ng-if 表达式尚未解析。 如何确保父指令知道其 DOM 树已发生更改?
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我有一些有效的代码,但有时它只是“跳转”到其他文本而不考虑间隔。 该代码基本上按时间间隔更改标题的文本。 var text = ["text1", "text2", "text3","text4","
我正在尝试将 onCLick 监听器添加到我的 PreferenceScreen 上的开关,但它不起作用。我尝试了 Java 教程中的代码并将其转换为 Kotlin,但由于某种原因它无法正常工作。 这
我们目前正在尝试升级我们的程序使用的 ffmpeg 版本。跳跃很大,因为我们目前使用的是 ffmpeg 0.8,最新版本是 1.2。 在这些测试中,我使用的是(让我说)我发现的令人惊叹的软件包 her
我有一个流程可以通过内容提供商从数据库中获取数据。 fun getDataFlow(): Flow { return flow { emit(Result.Loading)
我是一名优秀的程序员,十分优秀!