获取组中最大值的id

eri*_*k.c 3 sql

我有一个表,我想收集每个组的项目的ID与列上的最大值,但我有一个问题.

SELECT group_id, MAX(time) 
FROM mytable
GROUP BY group_id
Run Code Online (Sandbox Code Playgroud)

这样我得到正确的行,但我需要id:

SELECT id,group_id,MAX(time)
FROM mytable
GROUP BY id,group_id
Run Code Online (Sandbox Code Playgroud)

这样我就得到了所有的行.我怎样才能从每个组获得最大值行的ID?

样本数据

id = 1, group_id = 1, time = 2014.01.03
id = 2, group_id = 1, time = 2014.01.04
id = 3, group_id = 2, time = 2014.01.04
id = 4, group_id = 2, time = 2014.01.02
id = 5, group_id = 3, time = 2014.01.01
Run Code Online (Sandbox Code Playgroud)

从那我应该得到身份:2,3,5谢谢!

Azi*_*ikh 8

使用您的工作查询作为子查询,如下所示:

SELECT `id` 
FROM `mytable` 
WHERE (`group_id`, `time`) IN (
  SELECT `group_id`, MAX(`time`) as `time` 
  FROM `mytable`
  GROUP BY `group_id`
)
Run Code Online (Sandbox Code Playgroud)

  • 如果多行的时间值相同,则不起作用 (4认同)

Abd*_*naf 6

看看下面的演示

DROP TABLE IF EXISTS mytable;

CREATE TABLE mytable(id INT , group_id INT , time_st DATE);

INSERT INTO mytable VALUES(1, 1, '2014-01-03'),(2, 1, '2014-01-04'),(3, 2, '2014-01-04'),(4, 2, '2014-01-02'),(5, 3, '2014-01-01');

/** Check all data **/
SELECT * FROM mytable;
+------+----------+------------+
| id   | group_id | time_st    |
+------+----------+------------+
|    1 |        1 | 2014-01-03 |
|    2 |        1 | 2014-01-04 |
|    3 |        2 | 2014-01-04 |
|    4 |        2 | 2014-01-02 |
|    5 |        3 | 2014-01-01 |
+------+----------+------------+


/** Query for Actual output**/

SELECT 
    id
FROM
    mytable 
JOIN
    ( 
      SELECT group_id, MAX(time_st) as max_time 
      FROM mytable GROUP BY group_id 
    ) max_time_table 
ON mytable.group_id = max_time_table.group_id AND mytable.time_st = max_time_table.max_time;    
+------+
| id   |
+------+
|    2 |
|    3 |
|    5 |
+------+
Run Code Online (Sandbox Code Playgroud)

  • 如果有 2 行具有相同的 group_id 和 time_st ,这会带来问题 (9认同)
  • 这在 SQL Server 中有效,而接受的答案则不然。 (2认同)