-
2021-01-18 21:19:27
按order_num分组取时间最早的(LAST_UPDATE_DATE asc),若要取最晚的改为desc
select ORDER_NUM,LAST_UPDATE_DATE,OPERATOR,rank from
(
select t.ORDER_NUM
,t.LAST_UPDATE_DATE
,t.OPERATOR
,@rownum:=@rownum+1 ,
if(@order_num=t.ORDER_NUM,@rank:=@rank+1,@rank:=1) as rank,
@order_num:=t.ORDER_NUM
from
(
select ORDER_NUM,LAST_UPDATE_DATE,OPERATOR from table_name
order by ORDER_NUM asc,LAST_UPDATE_DATE asc
) t
,(select @rownum :=0 , @order_num := null ,@rank:=0) a
) result
order by ORDER_NUM desc
最近经常处理mysql字符串,突然发现一种不一样的思路,也可以实现分组排序取第一或最后:
select ORDER_NUM
,case when locate('|',OPERATOR) > 0 then SUBSTR(OPERATOR,1,INSTR(OPERATOR,'|')-1) else OPERATOR end
from
(
SELECT ORDER_NUM
,group_concat(DISTINCT OPERATOR ORDER BY LAST_UPDATE_DATE SEPARATOR '|') AS OPERATOR
FROM table_name
GROUP BY ORDER_NUM
) result
update
最近看别人的面试题遇到一个需要按列的大小取最大的,在此记录下:
select id, greatest(score1,score2,score3) as score from score;
从score表中取出每个id最大的score(取最小则用least)
update at 2019/6/18
MySQL新版本已经支持窗口函数了,此文可以作废了:)
更多相关内容 -
JAVA JDK8 List分组获取第一个元素的方法
2020-08-26 15:55:05今天小编就为大家分享一篇关于JAVA JDK8 List分组获取第一个元素的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
mysql分组排序取第一条数据
2022-02-22 19:45:31mysql 根据一个字段分组,各种排序,然后,取第一条数据 1. 分组字段加排序字段先排序 2. 再按分组字段分组,取第一条即可 with t_picture as( SELECT npi_product_id,is_default_one,update_time, uri FROM ...需求:
mysql 根据某一个字段分组,然后组内排序,最后每组取排序后的第一条数据
1. 先使用(分组字段+排序字段)排序
相当于实现了分组和排序,只是没有取导每组的第一条数据;
2. 再按分组字段分组,取第一条即可
实例如下:
with t_picture as( SELECT npi_product_id,is_default_one,update_time, uri FROM datahub_product_attachment where type=1 ORDER BY npi_product_id,is_default_one DESC,update_time DESC ) SELECT npi_product_id, (ARRAY_AGG(uri))[1] as uri FROM t_picture group by npi_product_id
必须在分组前排序,分组后排序是对分组字段和聚合字段排序。
-
mysql分组排序取第一条记录
2021-04-25 02:17:41先说结论:在Mysql中,通过GroupBy分组后,会取主键ID最小的一条数据作为分组后的数据。如果存在需求,根据其他字段排序后取对应字段最大或者最小值的话,通过SQL语句是可以实现的,核心在于排序后需要加Limit xx。...先说结论:在Mysql中,通过GroupBy分组后,会取主键ID最小的一条数据作为分组后的数据。如果存在需求,根据其他字段排序后取对应字段最大或者最小值的话,通过SQL语句是可以实现的,核心在于排序后需要加Limit xx。
先直接看结论
数据如下:
id
user_name
user_sex
user_age
1
张三18
男
18
2
李四17
男
17
3
王丽18
女
18
4
孔梦19
女
19
需求:查询出男生女生年龄最小的数据
正确解法select id,user_name,user_sex,user_age from (
SELECT id,user_name,user_sex,user_age FROM `user_test`
order by user_age
limit 100
)A
group by A.user_sex
结果如下:
id
user_name
user_sex
user_age
2
李四17
男
17
3
王丽18
女
18
常规思路(不知道加 limit)select id,user_name,user_sex,user_age from (
SELECT id,user_name,user_sex,user_age FROM `user_test`
order by user_age
)A
group by A.user_sex
结果如下:
id
user_name
user_sex
user_age
1
张三18
男
18
3
王丽18
女
18
男生是取的年龄最大的,女生则是年龄最小的,唯一的共同点在于取得值都是各自分组内 ID 最小的那个
验证
为了验证 GroupBy 以后是以id取优先级,我改一下id值,可以发现分组后永远取的是 id 最小的那个,跟group by的字段没任何关系
![]
原因
在知乎上找到了相应的问题,发现有人说是命中主键 id 最小的,也有人说是谬 论。根据提供的资料,还是看不懂。目前只能先记录下当前的解决方案。
GROUP BY是如何选择哪一条数据留下的?,
优化
limit xx ,可以默认写成 1000 这种,但是如果实际场景每组的数据量很大的话,limit 太小了可能直接就导致数据不全了,可以采用动态拼接 SQL 语句的办法:先查询出指定条件数据的个数(dataCount),将 datacount 作为参数替换 xx 即可。
-
Oracle中实现分组后按时间排序取第一条
2021-09-18 17:28:18②分组排序后取第一条的效果: 二、sql语句 2.1、基础语句 select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 排序的字段 desc) rw from 表 a) t where t.rw = 1 ...一、实现效果
①原表效果:存在重复的编号(PARTNER_ID)内容,访问时间(VISIT_DATE)不同
②分组排序后取第一条的效果:【实现对编号去重,且取访问时间最新的一条数据】
二、sql语句
2.1、基础语句
select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 排序的字段 desc) rn from 表 a) t where t.rn = 1
2.2、实现语句
【实现对编号去重,且取访问时间最新的一条数据】的sql语句如下:
SELECT * FROM( SELECT ROW_NUMBER()over(PARTITION by PARTNER_ID ORDER BY VISIT_DATE DESC) as RN,VI.PARTNER_ID,VI.VISIT_DATE FROM VISIT_INFO VI ) dual WHERE RN=1
三、参考资料
-
Mysql取分组后的每组第一条数据
2020-12-14 11:00:06Mysql取分组后的每组第一条数据 gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组... -
postgres数据库分组排序后再取第一条数据
2021-12-23 11:58:34postgres数据库分组排序后再取第一条数据,最后再分页 需求:先根据企业ID分组,然后按时间倒序,取每一组的第一条数据,最后再进行分页。 select * from (select row_number()over(partition by company_id ... -
oracle 根据字段分组排序 取其第一条数据
2021-04-29 16:46:15以某个字段分组 取其第一条数据 select * from (select t.app_id, t.emp_no, t.device_id, t.device_type, t.last_connect_time, t.device_model, rank() over(partition by t.device_type or -
MySQL分组排序(取第一或最后)
2021-01-19 23:25:30MySQL分组排序(取第一或最后)方法一:速度非常慢,跑了30分钟SELECTcustid,apply_date,rejectruleFROM(SELECT*,IF( @pkey <> custid, @rank := 1, @rank := @rank + 1 ) AS rank,@pkey := custidFROM... -
MySQL实现分组排序并取组内第一条数据
2022-05-07 22:06:11MySQL分组取组内第一条数据 -
MongoDB聚合分组取第一条记录的案例与实现方法
2020-12-16 04:20:15今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分组中最近一笔插入的数据,然后将这些符合条件的数据导入到集合mt_resources_access_log_new中。... -
mysql5.7,分组排序取第一行
2021-06-22 11:39:45防止合并的构造对于派生表和视图引用是相同的: 1.聚合函数( SUM() , MIN() , MAX() , COUNT()等) 2.DISTINCT 3.GROUP BY 4.HAVING 5.LIMIT 6.UNION或UNION ALL 7.选择列表中的子查询 8.分配给用户变量 9.仅... -
mysql分组排序取每组第一条
2021-07-29 12:05:56记录一下今天遇到的一个需求: 表 (5-8秒刷新一次) 取更新时间、采集点编号和最新读数 说明一下 表里面有很多点位数据 然后固定时间insert一次 我需要拿到 最新时间的 所有点位的 数据 create table C010_CURRENT_... -
MYSQL实现分组排序并取组内第一条数据
2019-07-17 10:04:00一、需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( select e.* from error_record e where ... -
Hive分组取第一条记录
2020-12-19 09:04:39举例:简写版的表结构:表数据:则 财务希望汇总记录如下:uidorder_idservice_completion_time2442017-02-03 12:23:01.03332017-11-30 12:23:01.0hive分组排序函数语法:row_number() over (part... -
Oracle 分组排序后取第一条数据
2021-04-14 14:21:02select * from ( select t., row_number() over (partition by user_sid order by sid desc) rn ,count() over ...where user_sid in (select sid from sys_user where user_state = ‘LOCKED’) ) where rn=1 -
mysql 分组排序取第一条记录
2020-08-27 16:17:22比如取每个班级成绩第一的学生等等 oracle 和 sqlserver支持函数,mysql不行 这里给一个粗暴的方法: 两个行数 GROUP_CONCAT(A ORDER BY B)和substring_index 思路: 1、GROUP_CONCAT(fA ORDER BY B) 按照... -
MongoTemplate分组排序取第一条记录
2021-10-22 10:30:32MongoTemplate分组排序取第一条记录 在开发过程中,竟然遇到这样一个需求,按照某一个字段或者某个查询条件进行分组。分组后取其最新的一条数据。 例如:在查询文件版本时,要求根据文件路径filePath分组,表示每一... -
postgresql 分组排序后获取组内第一条数据
2021-08-31 17:06:27select * from ( select row_number() over (partition by code order by id asc) rowId,* from xx.xx p ) t where rowId = 1 按code进行分区,id正序 -
mysql实现分组排序并取组内第一条数据
2021-07-20 16:18:45mysql中有一张表用户表user 其中李四是重复数据 id name 1 张三 2 李四 3 李四 4 王五 如何去重实现查询效果为 id name 1 张三 2 李四 4 王五 id为主键,去重之后保留id最小的一条数据 或者可以实现效果为 id name 1 ... -
SQL实现根据字段对表分组,并对每组进行排序取第一条数据
2022-04-20 16:13:24SQL实现根据字段对表分组,并对每组进行排序取第一条数据一、ROW_NUMBER()二、SQL实现 一、ROW_NUMBER() ORCLE中,ROW_NUMBER() 为排名函数,负责对返回结果编号;over()为分析函数,更加()中内容返回多个结果集; ... -
pyodps中一些经验:取分组排序后的第一条数据
2019-01-24 18:57:45pandas中在groupby后只要用first就可以去出分组后的第一行。 例如: # 以student_id为分组列,然后取出分组后每组的第一条数据 df_stu_frist_course = df_stu_course.groupby('student_id').first() 然而pyodps... -
Oracle 分组排序取第一条数据
2020-09-08 17:08:49需求:先分组,再按时间排序,最后取分组第一条 利用oracle的开窗函数可以实现 以下是模板sql ,自行替换 select t.* from (select a.*, row_number() over(partition by 需要分组的字段 order by 更新时间 ... -
lambda时间排序分组后取第一条
2019-12-26 14:28:47lambda排序分组后取第一条 package com.dkha.government.contral; import lombok.Data; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.... -
oracle 实现分组后排序取第一条
2019-08-07 18:46:161.这里要将数据按PARTNER_ID 分组并且按时间排序取第一 select * from ( SELECT ROW_NUMBER()over(PARTITION by PARTNER_ID ORDER BY VISIT_DATE DESC) as ro,v.PARTNER_ID,v.VISIT_DATE from VISIT_INFO v ... -
MySQL分组排序取第一列数据的方法
2019-02-25 23:23:14需求分析:多行数据分组排序之后,如何获取第一行数据?具体案例如下: 根据要求查询结果: 查询结果username不能重复; username重复的选择条件是status为1则选择该条,多个1则按照createtime选取最近的一条; ... -
mysql 5.7版本分组并排序,取第一条
2021-08-11 20:04:545.7版本的mysql无法用窗口函数,不能直接做到分组后,组内排序,项目中为了获取每组的降序第一名,实现思路如下: 上图是模拟数据, ```sql SELECT * FROM ( SELECT `name`, money, times FROM syc ORDER BY ... -
sql分组排序,查询每组第一个数据
2020-08-26 14:25:27sql分组排序,查询每组第一个数据