mysql - 根据两列的不同组合选择最近的行

标签 mysql sql greatest-n-per-group

我正在编写一个 cronjob,它对我数据库中的 flags 表运行分析,结构如下:

| id | item | def | time_flagged | time_resolved | status  |
+----+------+-----+--------------+---------------+---------+
| 1  | 1    | foo | 1519338608   | 1519620669    | MISSED  |
| 2  | 1    | bar | 1519338608   | (NULL)        | OPEN    |
| 3  | 2    | bar | 1519338608   | 1519620669    | IGNORED |
| 4  | 1    | foo | 1519620700   | (NULL)        | OPEN    |

对于每个不同的 def,对于每个唯一的 price,我想获取“最新”行 (IFNULL(`time_resolved`, `time_flagged`)作为`时间`)。如果给定的 def-item 组合不存在这样的行,那没关系;我只是不想给定的 def-item 组合有任何重复项。

对于上面的数据集,我想选择:

| def | item | time       | status  |
+-----+------+------------+---------+
| foo | 1    | 1519620700 | OPEN    |
| bar | 1    | 1519338608 | OPEN    |
| bar | 2    | 1519620669 | IGNORED |

第 1 行未包含在内,因为它被第 4 行“覆盖”了,因为两行具有相同的 def-item 组合,而后者具有更近的 time

数据集将有几十个不同的def,几百个不同的item,以及大量的flag这只会随着时间的推移而增加。

我该怎么做呢?我看到 greatest-n-per-group 标签充满了类似的问题,但我没有看到任何涉及我需要跨两列的“嵌套分组”的特定情况。

最佳答案

你可以试试:

select distinct def, item, IFNULL(time_resolved, time_flagged) AS time, status from flags A where IFNULL(time_resolved, time_flagged) = (select MAX(IFNULL(time_resolved, time_flagged)) from flags B where A.item = B.item and A.def = B.def )

我知道这不是最好的方法,但它可能适合你

关于mysql - 根据两列的不同组合选择最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49039546/

相关文章:

mysql - 在单个 mysql 查询中将几个替代子字符串更改为另一个子字符串

mysql - 我需要将新项目添加到 SQL 表中并更新旧项目

php - Yii2加入子查询

android - 获取半径内的位置

MySQL 数据透视表/交叉表

如果里面的文本包含特定文本,则 SQLite 选择字段

mysql - SELECT 任意记录组的最新记录(忽略只有一条记录的记录)

sql - 简单的 sql(我希望!)

mysql - 如果以前为 postgres 安装了 thinking sphinx,我是否需要为 mysql 重新安装它?

sql - 获取 SQL 中另一列的每个值的最常见值