Doris使用mysql语法查询时只保留group by分组并order by排序出来的每个分组第一条记录的方法
文章目录
- Doris使用mysql语法查询时只保留group by分组并order by排序出来的每个分组第一条记录的方法
- 模拟登录记录表
- 假设我们要查询每个用户最近登录时间
- mysql示范
- doris实现
Doris使用mysql语法查询时只保留group by分组并order by排序出来的每个分组第一条记录的方法
模拟登录记录表
假设有个登录记录表叫 test.t_login_log,同步到doris后表名叫 ods_test_login_log
假设我们要查询每个用户最近登录时间
mysql示范
不太熟悉group by的同学可能这样写sql
select * from test.t_login_log group by user_id order by create_time desc
查询结果可以看到,mysql自动帮我们每个分组只保留分组中第一条数据,而排序是等分组、where筛选完了才排序的,并不会对分组排序再取第一条。
那在MySQL中你需要先按你要排序的字段排序完,再去分组就能得到你想要的了
select * from (select * from test.t_login_log order by create_time desc) as t group by t.user_id
doris实现
手动建了个模拟表并写入数据
create table ods_test_login_log(
id int,
user_id int ,
create_time datetime
)
DISTRIBUTED BY HASH(`id`) BUCKETS 1
第一步先用row_number()函数给记录标上序号
select *,ROW_NUMBER () over(PARTITION by user_id order by create_time desc) as rn from test2.ods_test_login_log
在标记录行序号的时候可以选择根据字段分区,根据字段排序
现在只保留每个分组第一条即可!因为前面根据user_id分过组了,每个组内只有一条记录行号为1
select * from (select *,ROW_NUMBER () over(PARTITION by user_id order by create_time desc) as rn from test2.ods_test_login_log) t where rn = 1