Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL获取每个组的最大其他列数据_Mysql - Fatal编程技术网

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 排除联接 选择t1.group_id,t1.`time`,t1.`data` 从'table'改为t1 左连接'table'作为t2 在t2.group_id=t1.`group_id` 和t1.`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子句,无论我做什么,它都表现得最好。