繁体   English   中英

获取组中最大值的id

[英]Get id of max value in group

我有一个表,我想从每组中收集项目的 ID,其中一列有最大值,但我遇到了问题。

SELECT group_id, MAX(time) 
FROM mytable
GROUP BY group_id

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

SELECT id,group_id,MAX(time)
FROM mytable
GROUP BY id,group_id

这样我就得到了所有的行。 我怎样才能从每组中获取时间最大值行的 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

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

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

SELECT `id` 
FROM `mytable` 
WHERE (`group_id`, `time`) IN (
  SELECT `group_id`, MAX(`time`) as `time` 
  FROM `mytable`
  GROUP BY `group_id`
)

看看下面的演示

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 |
+------+

当多个组可能包含相同的值时,您可以使用

SELECT subq.id
FROM (SELECT id,
             value,
             MAX(time) OVER (PARTITION BY group_id) as max_time
      FROM mytable) as subq
WHERE subq.time = subq.max_time

此处的子查询生成一个新列 ( max_time ),其中包含每组的最大时间。 然后我们可以过滤timemax_time是相同的。 请注意,如果最大值在同一组中多次出现,这仍会为每个组返回多行。

完整示例:


CREATE TABLE test (
  id INT,
  group_id INT,
  value INT
);
INSERT INTO test (id, group_id, value) VALUES (1, 1, 100);
INSERT INTO test (id, group_id, value) VALUES (2, 1, 200);
INSERT INTO test (id, group_id, value) VALUES (3, 1, 300);
INSERT INTO test (id, group_id, value) VALUES (4, 2, 100);
INSERT INTO test (id, group_id, value) VALUES (5, 2, 300);
INSERT INTO test (id, group_id, value) VALUES (6, 2, 200);
INSERT INTO test (id, group_id, value) VALUES (7, 3, 300);
INSERT INTO test (id, group_id, value) VALUES (8, 3, 200);
INSERT INTO test (id, group_id, value) VALUES (9, 3, 100);

select * from test;
 id | group_id | value 
----+----------+-------
  1 |        1 |   100
  2 |        1 |   200
  3 |        1 |   300
  4 |        2 |   100
  5 |        2 |   300
  6 |        2 |   200
  7 |        3 |   300
  8 |        3 |   200
  9 |        3 |   100
(9 rows)

SELECT subq.id
FROM (SELECT id,
             value,
             MAX(value) OVER (partition by group_id) as max_value
      FROM test) as subq
WHERE subq.value = subq.max_value;
 id 
----
  3
  5
  7
(3 rows)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM