mysql,求教数据分组后取第一条的问题

bin_fei 2019-06-17 10:52:40
现有表数据如下,需要按照column1,column2进行分组,然后取column4最新的一条,其中column4有最新时间相同的,这种情况下如何取其中一条呢?谢谢。

column1,column2,column3,column4
1,2,3,2019-06-01:00:00:00
1,2,4,2019-06-01:00:00:00
5,6,7,2019-06-01:00:03:00
8,9,10,2019-06-01:01:00:00
8,9,11,2019-06-01:01:00:00
...全文
4964 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
select aa.* from ck_info as aa right join ( select account, max(bal+0) as max from ck_info group by account ) as bb on bb.max = aa.bal and bb.account = aa.account
Shanafilan 2019-09-12
  • 打赏
  • 举报
回复
引用 14 楼 bin_fei 的回复:
[quote=引用 11 楼 oneouto 的回复:] [quote=引用 10 楼 bin_fei 的回复:] [quote=引用 7 楼 oneouto 的回复:] [quote=引用 3 楼 bin_fei 的回复:] [quote=引用 2 楼 oneouto 的回复:] 先分组,在主键倒排序,取第一条 select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;
你这结果不对,我想要取得的结果如下: column1,column2,column3,column4 1,2,3,2019-06-01 00:00:00 5,6,7,2019-06-01 00:03:00 8,9,10,2019-06-01 01:00:00 目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote] select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1; unix_timestamp 时间戳[/quote] 最后的 limit 1是作用于全部结果,所以最后只取到一条数据,是不对的,你自己实验下。我要取的是分组后取每组里的最新一条,不是全部结果里取一条。[/quote] select * from (select 字段, unix_timestamp(column4) as colu from table_column order by colu desc) group by column1, column2; [/quote] 感谢,测试了下应该可行,MYSQL用的不多想请教下大神,order by后的结果集最后group by为啥就能自动取到分组后第一条呢?[/quote] 这个是应该是新版mysql group by的双刃剑,之前select的结果只能是在groupby中的列,现在select的列,可以不是groupby中的列,那么这个时候不在groupby中的列应该会有多条记录,原来的mysql会报,子查询中返回的结果不是一条,新版的就直接默认给取第一条了,有时候利用这个小特性,还能实现oracle中的row_number() over(partition by)实现的功能
空城机 2019-06-22
  • 打赏
  • 举报
回复
可以这样select column1,column2,MAX(column3),MAX(column4) from a group by column1,column2
也可以使用rand去随机选一个column3
oneouto 2019-06-19
  • 打赏
  • 举报
回复
引用 14 楼 bin_fei 的回复:
[quote=引用 11 楼 oneouto 的回复:] [quote=引用 10 楼 bin_fei 的回复:] [quote=引用 7 楼 oneouto 的回复:] [quote=引用 3 楼 bin_fei 的回复:] [quote=引用 2 楼 oneouto 的回复:] 先分组,在主键倒排序,取第一条 select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;
你这结果不对,我想要取得的结果如下: column1,column2,column3,column4 1,2,3,2019-06-01 00:00:00 5,6,7,2019-06-01 00:03:00 8,9,10,2019-06-01 01:00:00 目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote] select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1; unix_timestamp 时间戳[/quote] 最后的 limit 1是作用于全部结果,所以最后只取到一条数据,是不对的,你自己实验下。我要取的是分组后取每组里的最新一条,不是全部结果里取一条。[/quote] select * from (select 字段, unix_timestamp(column4) as colu from table_column order by colu desc) group by column1, column2; [/quote] 感谢,测试了下应该可行,MYSQL用的不多想请教下大神,order by后的结果集最后group by为啥就能自动取到分组后第一条呢?[/quote] 这个原理不清楚,只是知道group by 获取的分组值是第一条,那就把数据提前按照规定排好,然后group by。
  • 打赏
  • 举报
回复
select c1,c2,c3,c4 from table group by c1,c2 having c4=max(c4) 为什么上面兄弟写的那么麻烦?
bin_fei 2019-06-19
  • 打赏
  • 举报
回复
引用 11 楼 oneouto 的回复:
[quote=引用 10 楼 bin_fei 的回复:]
[quote=引用 7 楼 oneouto 的回复:]
[quote=引用 3 楼 bin_fei 的回复:]
[quote=引用 2 楼 oneouto 的回复:]
先分组,在主键倒排序,取第一条
select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;

你这结果不对,我想要取得的结果如下:
column1,column2,column3,column4
1,2,3,2019-06-01 00:00:00
5,6,7,2019-06-01 00:03:00
8,9,10,2019-06-01 01:00:00
目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote]


select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1;
unix_timestamp 时间戳[/quote]

最后的 limit 1是作用于全部结果,所以最后只取到一条数据,是不对的,你自己实验下。我要取的是分组后取每组里的最新一条,不是全部结果里取一条。[/quote]

select * from (select 字段, unix_timestamp(column4) as colu from table_column order by colu desc) group by column1, column2;
[/quote]

感谢,测试了下应该可行,MYSQL用的不多想请教下大神,order by后的结果集最后group by为啥就能自动取到分组后第一条呢?
bin_fei 2019-06-19
  • 打赏
  • 举报
回复
引用 9 楼 hjnfgv 的回复:
应该是要分组排序取第一条
select t1.* from
(SELECT column1,column2,max(column3) column3,max(column4) column4 from table_column group by column1,column2) t1
where 1>(select count(*) from (SELECT column1,column2,max(column3) column3,max(column4) column4 from table_column group by column1,column2) t2 where t1.column1=t2.column1,t1.column2=t2.column2 and t1.column4<t2.column4)


感谢,你这种方法不确定可不可行,我试验了下t1里select部分改成“SELECT *,max(column4) column4”最后出来的结果不对,因为我的表字段有几十上百个,要是全都写出来太麻烦了,有改进的方法不?
bin_fei 2019-06-19
  • 打赏
  • 举报
回复
引用 8 楼 ZJHZ_叶 的回复:
select * from (
select a.*,
if(@column1=column1 and @column2=column2,@rownum:=@rownum+1,@rownum:=1) AS Rn,
@column1:=column1 ncolumn1,
@column2:=column2 ncolumn2
from table_column a,(select @rownum:=0,@column1:=null,@column2:=null) b
) c
where rn=1


这用法好高级,mysql用的不多,我研究下,感谢
Lisa11321 2019-06-19
  • 打赏
  • 举报
回复
select * from table where id = (select id from table where col1 = col1 and col2 = col2 order by col3 limit 1) 手打的,别名什么都没加,需要改一下
oneouto 2019-06-19
  • 打赏
  • 举报
回复
引用 10 楼 bin_fei 的回复:
[quote=引用 7 楼 oneouto 的回复:] [quote=引用 3 楼 bin_fei 的回复:] [quote=引用 2 楼 oneouto 的回复:] 先分组,在主键倒排序,取第一条 select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;
你这结果不对,我想要取得的结果如下: column1,column2,column3,column4 1,2,3,2019-06-01 00:00:00 5,6,7,2019-06-01 00:03:00 8,9,10,2019-06-01 01:00:00 目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote] select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1; unix_timestamp 时间戳[/quote] 最后的 limit 1是作用于全部结果,所以最后只取到一条数据,是不对的,你自己实验下。我要取的是分组后取每组里的最新一条,不是全部结果里取一条。[/quote] select * from (select 字段, unix_timestamp(column4) as colu from table_column order by colu desc) group by column1, column2;
AHUA1001 2019-06-19
  • 打赏
  • 举报
回复
SELECT * FROM table_name t1 JOIN ( SELECT column1, column2, MIN(column4) column4 FROM table_name GROUP BY column1, column2 ) t2 ON t2.column1 = t1.column1 AND t2.column2 = t1.column2 AND t2.column4 = t1.column4;
ZJHZ_叶 2019-06-18
  • 打赏
  • 举报
回复
select * from (
select a.*,
if(@column1=column1 and @column2=column2,@rownum:=@rownum+1,@rownum:=1) AS Rn,
@column1:=column1 ncolumn1,
@column2:=column2 ncolumn2
from table_column a,(select @rownum:=0,@column1:=null,@column2:=null) b
) c
where rn=1
oneouto 2019-06-18
  • 打赏
  • 举报
回复
引用 3 楼 bin_fei 的回复:
[quote=引用 2 楼 oneouto 的回复:] 先分组,在主键倒排序,取第一条 select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;
你这结果不对,我想要取得的结果如下: column1,column2,column3,column4 1,2,3,2019-06-01 00:00:00 5,6,7,2019-06-01 00:03:00 8,9,10,2019-06-01 01:00:00 目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote] select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1; unix_timestamp 时间戳
bin_fei 2019-06-18
  • 打赏
  • 举报
回复
引用 5 楼 ZJHZ_叶 的回复:
SELECT column1,column2,max(column3) ,max(column4)
from table_column
group by column1,column2


我这只是举个例子,实际可能有100列数据,然后分组后只想取某一列时间最新的一条完整数据。
ZJHZ_叶 2019-06-18
  • 打赏
  • 举报
回复
SELECT column1,column2,max(column3) ,max(column4)
from table_column
group by column1,column2
bin_fei 2019-06-18
  • 打赏
  • 举报
回复
引用 7 楼 oneouto 的回复:
[quote=引用 3 楼 bin_fei 的回复:]
[quote=引用 2 楼 oneouto 的回复:]
先分组,在主键倒排序,取第一条
select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;

你这结果不对,我想要取得的结果如下:
column1,column2,column3,column4
1,2,3,2019-06-01 00:00:00
5,6,7,2019-06-01 00:03:00
8,9,10,2019-06-01 01:00:00
目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。[/quote]


select 字段, unix_timestamp(column4) as colu from table_column group by column1, column2 order by colu desc limit 1;
unix_timestamp 时间戳[/quote]

最后的 limit 1是作用于全部结果,所以最后只取到一条数据,是不对的,你自己实验下。我要取的是分组后取每组里的最新一条,不是全部结果里取一条。
hjnfgv 2019-06-18
  • 打赏
  • 举报
回复
应该是要分组排序取第一条 select t1.* from (SELECT column1,column2,max(column3) column3,max(column4) column4 from table_column group by column1,column2) t1 where 1>(select count(*) from (SELECT column1,column2,max(column3) column3,max(column4) column4 from table_column group by column1,column2) t2 where t1.column1=t2.column1,t1.column2=t2.column2 and t1.column4<t2.column4)
bin_fei 2019-06-17
  • 打赏
  • 举报
回复
引用 1 楼 ZJHZ_叶 的回复:
SELECT column1,column2,max(column4)
from table_column
group by column1,column2


你这结果取出来的不是完整行,假如每条数据是100条,我想以2两列为主key,分组后取时间最新的一条,最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。
例子想取得的结果如下。
column1,column2,column3,column4
1,2,3,2019-06-01 00:00:00
5,6,7,2019-06-01 00:03:00
8,9,10,2019-06-01 01:00:00
bin_fei 2019-06-17
  • 打赏
  • 举报
回复
引用 2 楼 oneouto 的回复:
先分组,在主键倒排序,取第一条
select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;

你这结果不对,我想要取得的结果如下:
column1,column2,column3,column4
1,2,3,2019-06-01 00:00:00
5,6,7,2019-06-01 00:03:00
8,9,10,2019-06-01 01:00:00

目前表里未建主键,想以column1,column2为主key,分组后取column4时间最新的一条,column4最新时间有相同的可能有N条,可以随机取其中一条都没关系,是要取完整的一整条数据。
oneouto 2019-06-17
  • 打赏
  • 举报
回复
先分组,在主键倒排序,取第一条 select 字段 from table_column group by column1, column2 order by 主键 desc limit 1;
加载更多回复(1)

56,914

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧