我正在编写一个 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/