在进行一张表进行groupby后获取最大id和最小id数据的sql语句

本文介绍了两种使用SQL语句从表中通过group by获取最大id和最小id的方法。第一种方法利用了变量来实现,第二种则采用了max与min结合group_concat及find_in_set函数来完成目标。通过对具体SQL语句的展示,读者可以了解如何灵活运用这些技术来优化查询效率。

在进行一张表进行groupby后获取最大id和最小id数据的sql语句;
方法一:变量
select result.* from (  
         select heyf_tmp.*,@rownum:=@rownum+1 as rownum, 
               if(@pdept=heyf_tmp.id,@rank:=@rank+1,@rank:=1) as rank, 
               @pdept:=heyf_tmp.id as id1 
from ( 
select distinct bpt.id, spi.userid,spi.startTime,spi.endTime,spi.orgId,spi.projectCode,
spi.endTime finishtime,1 as result,IFNULL(bpt.planName,'日常巡查') planName,
su.nickname nickname,bwp.`name` projectCodeName from bus_patrol_info spi
  left join bus_patrol_task bpt on spi.orgid=bpt.orgid and bpt.result=1 
  left join sys_user su on spi.userId = su.id
  left JOIN bus_water_project bwp on bwp.`code` = bpt.projectCode
  where 1=1
 AND spi.orgId = "372" and spi.userId = bpt.userId 
order by bpt.id,spi.startTime desc
) heyf_tmp , 
    (select @rownum :=0 , @pdept := null ,@rank:=0) a 
 ) result where rank=1

方法为: MAX(id)-》 GROUP_CONCAT(a.id)-》FIND_IN_SET
SELECT a.waterlevel,IFNULL(1/IFNULL(1/(max(flow)-min(flow)),0),0) flow,time FROM(
select AVG(waterlevel) waterlevel,flow,time from bus_waterregime 
GROUP BY  DATE_FORMAT(time,'%Y-%m-%d %H') UNION
SELECT 'NaAVG' waterlevel,flow,time FROM bus_waterregime b where 
FIND_IN_SET(b.id,(SELECT GROUP_CONCAT(a.id) id FROM(
select MAX(id) id from bus_waterregime GROUP BY  DATE_FORMAT(time,'%Y-%m-%d %H'))a))
)a GROUP BY DATE_FORMAT(time,'%Y-%m-%d %H')

在公司有限的数据中两者的查询时间差不多,如有兴趣者可以一试两者的性能如何

要查找 `user` 中 `number` `bingqu_id` 字段组合重复的记录,可以通过 `GROUP BY` `HAVING` 子句实现。具体查询语句如下: ```sql SELECT number, bingqu_id FROM user GROUP BY number, bingqu_id HAVING COUNT(*) > 1; ``` 此查询会返回所有 `number` `bingqu_id` 组合重复的记录,并且每组重复的组合仅显示一次。如果需要查看具体的重复行,可以使用子查询来筛选出这些数据: ```sql SELECT id, number, bingqu_id FROM user WHERE (number, bingqu_id) IN ( SELECT number, bingqu_id FROM user GROUP BY number, bingqu_id HAVING COUNT(*) > 1 ); ``` 上述查询会列出所有 `number` `bingqu_id` 字段组合重复的具体记录,包括每条重复的行。如果中存在大量数据,可以通过添加额外的索引来优化查询性能,例如为 `number` `bingqu_id` 字段创建联合索引[^1]。 ### 查询重复记录并统计重复次数 如果还需要统计每个重复组合的出现次数,可以使用以下查询: ```sql SELECT number, bingqu_id, COUNT(*) AS duplicate_count FROM user GROUP BY number, bingqu_id HAVING COUNT(*) > 1; ``` 此查询不仅会列出重复的字段组合,还会显示每个组合的重复次数。 ### 删除重复记录 如果需要删除重复记录,同时保留其中一条记录,可以使用以下方法: ```sql DELETE u1 FROM user u1 JOIN user u2 ON u1.number = u2.number AND u1.bingqu_id = u2.bingqu_id AND u1.id > u2.id; ``` 此查询会删除具有相同 `number` `bingqu_id` 的重复记录,但保留 `id` 最小的那条记录。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值