SQL分组选取时间最大的记录

说明

最近没太多好写的ヽ(ー_ー)ノ,来记录一下昨天写的有趣的SQL好了

快速开始

首先来看一下我们的数据长啥样吧,建表SQL戳->test_max_time.sql

id    create_date                  other_id(要分组的字段)

1    2020-11-20 19:36:19    111
2    2020-11-22 19:36:24    222
3    2020-11-21 19:36:24    111
4    2020-11-21 19:36:24    222
5    2020-11-21 19:36:24    111

首先要了解一个问题,分组后可能会有最大时间相同的多条数据,比如我上面的数据3和5,所以分组取时间最大的记录很可能会出现多条,那么我们要仅取一条的话一定要再加上其他限制才能仅取出一条来

方法一

SELECT * FROM test_max_time 
WHERE id in (
SELECT  max(id) as maxId
FROM    test_max_time 
INNER JOIN
(
	SELECT  other_id as b_other_id, MAX(create_date) max_date
	FROM    test_max_time
	GROUP   BY other_id
) b
ON  other_id = b_other_id AND create_date = max_date
GROUP BY other_id)

方法一首先分组选取最大的时间及分组id,然后再通过INNER JOIN筛选出分组id和时间都为最大的记录,最后用max来取出分组中Id最大并且时间也最大的Id(保证分组后只有一条数据出现),然后再通过id in的方式就好了,结果:

id    create_date                 other_id(要分组的字段)

2    2020-11-22 19:36:24    222
5    2020-11-21 19:36:24    111

方法二

SELECT * FROM test_max_time 
WHERE id in (
SELECT  max(id) as maxId
FROM    test_max_time
LEFT JOIN
(
	SELECT  other_id as b_other_id, MAX(create_date) max_date
	FROM    test_max_time
	GROUP   BY other_id
) b
ON  other_id = b_other_id AND create_date = max_date
GROUP BY other_id, max_date
having max_date is not null)

方法二与方法一的区别在于使用的是LEFT JOIN,并且在第二次分组的时候条件不仅为other_id,还加上了max_date,来排除主表比连接表多出来的字段,例如第四条记录进行左连接后变成了下面的样子,所以还需要使用having对连接表去除不是最大时间的记录

id    create_date                 other_id   max_date

4    2020-11-21 19:36:24    222           null

结果与方法一相同:

id    create_date                 other_id(要分组的字段)

2    2020-11-22 19:36:24    222
5    2020-11-21 19:36:24    111

如果对方法一的INNER JOIN不太熟悉,可以采用方法二的LEFT JOIN的方式来了解为什么需要用INNER JOIN

你可能感兴趣的:(Java,sql,分组时间最大记录)