MySQL获取每个组的最大其他列数据
这张桌子好像MySQL获取每个组的最大其他列数据,mysql,Mysql,这张桌子好像 group_id | time | data | others... 1 2020-11-30 12:00:00 13 1 2020-11-30 13:00:00 15 2 2020-11-30 12:30:00 254 3 2021-02-21 18:00:00 25565 ... 我想获得最新时间的数据,对于指定的每个组,每个组的最新时间可能不同 所以我写下了 SE
group_id | time | data | others...
1 2020-11-30 12:00:00 13
1 2020-11-30 13:00:00 15
2 2020-11-30 12:30:00 254
3 2021-02-21 18:00:00 25565
...
我想获得最新时间的数据,对于指定的每个组,每个组的最新时间可能不同
所以我写下了
SELECT group_id, max(time), data
where group_id between (...)
(and others = ...)
group by group_id
但它的数据并不是当时的价值,实际上似乎是最新的记录
如何获得每组的最长时间数据?我自己使用JOIN找到了答案
with tmp as (
SELECT group_id, max(time) as time FROM table
WHERE group_id between (...)
(and others = ...)
group by group_id
)
SELECT r.data FROM table as r
INNER JOIN tmp ON r.group_id = tmp.group_id and r.time = tmp.time
where group_id between (...)
(and others = ...)
由于在group_id,time上使用主键,因此可以使用标准的排除联接,而不是group BY,因为记录是明确的 在本例中,若要使用相应的其他值获取group_id和MAXtime,您可以将联接表保留为a.group_id=b.group_id和a.time
| group_id | time | data |
| -------- | ------------------- | ----- |
| 1 | 2020-11-30 13:00:00 | 15 |
| 2 | 2020-11-30 12:30:00 | 254 |
| 3 | 2021-02-21 18:00:00 | 25565 |
| group_id | time | data |
| -------- | ------------------- | ----- |
| 1 | 2020-11-30 13:00:00 | 15 |
| 2 | 2020-11-30 12:30:00 | 254 |
| 3 | 2021-02-21 18:00:00 | 25565 |
或者,由于您的主键是group_id,time,所以您可以在子查询条件中使用复合的MAXtime
子查询中的复合词
选择t1.group_id,t1.`time`,t1.`data`
从'table'改为t1
其中t1.others=。。。。
和t1.group_id,t1.`time`IN
选择组id,最大时间`
从`表`
其中组id介于。。。。
逐组\u id
;
结果:
| group_id | time | data |
| -------- | ------------------- | ----- |
| 1 | 2020-11-30 13:00:00 | 15 |
| 2 | 2020-11-30 12:30:00 | 254 |
| 3 | 2021-02-21 18:00:00 | 25565 |
| group_id | time | data |
| -------- | ------------------- | ----- |
| 1 | 2020-11-30 13:00:00 | 15 |
| 2 | 2020-11-30 12:30:00 | 254 |
| 3 | 2021-02-21 18:00:00 | 25565 |
您的表是否有主键列?如果同一组中有两行或更多行同时出现,您打算如何打破这种关系?当然,该表在group_id,time上有主键,这样就可以了。如果不使用聚合函数,MySQL可以从未分组的列数据中自由检索任何值,这通常是第一条或最后一条记录,具体取决于索引。您需要按MAXtime筛选结果集,并确定数据列的排序。这通常是通过排除加入完成的。谢谢您的回答!我对这两种方法进行了测试,发现左连接的可空开销非常大!所以我应用了内部连接方法,它使用复合at ON子句,无论我做什么,它都表现得最好。