mysql分组排序,取每组第一条数据

mysql分组排序,取每组第一条数据,第1张

MySQL:57

SQL语句的写法:

思路:先进行排序,然后再进行分组,获取每组的第一条。

derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL57版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等 *** 作。

上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误。

假设我们现在把sql中的 distinct(aid) tid ,去掉,会发现子查询(或者叫:临时表)中的order by aid desc失效了。

为什么会这样呢?

原理分析:

我们这里使用了临时表排序,继而对其结果进行分组,结果显示失败,加了distinct(aid) tid,后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:

一旦外部表使用了group by, 那么临时表(派生表 derived table)将不会执行filesort *** 作(即 order by 会被忽略 )。之后我使用了limit可以使其生效,原因是因为要使派生表order by生效, 派生表可以通过使用group by、limit、having、distinct等等使其生效 (方法有好多,详情可看文档 >

sqlserver2005以上版本适用

;with cte as

(select ,row_number() over(partition by classifid order by datetime desc) as rn from news

where categoryid=2

)select from cte where rn<=2

---------------------------

mysql有些版本好像不支持派生表查询

select from (

select ,(select count() from news where aclassifid=classifid and adatetime<=datetime)rn

from news a where categoryid=2

)t where rn<=2

前5次,应该是按时间排序,不区分打卡地点,对吧?!

使用OLAP函数就能解决问题啦:

select from (

select

(row_number() over (partition by 用户ID order by 打卡时间 asc)) AS row_id

用户ID,

打卡地点ID,

打卡时间

from table_name) t

where row_id<=5

语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank

partition by:类似hive的建表,分区的意思;

order by :排序,默认是升序,加desc降序;

rank:表示别名

表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

浙江,杭州,300

浙江,宁波,150

浙江,温州,200

浙江,嘉兴,100

江苏,南京,270

江苏,苏州,299

江苏,某市,200

江苏,某某市,100

主要注意打圈的:

row_number:顺序下来

rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)

dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)

国家 城市 Visitors

阿联酋,阿布扎比,137

阿联酋,阿布扎比,146

阿联酋,阿布扎比,178

阿联酋,阿布扎比,337

阿联酋,阿布扎比,178

阿联酋,阿布扎比,227

阿联酋,阿布扎比,157

阿联酋,迪拜,144

阿联酋,迪拜,268

阿联酋,迪拜,103

阿联酋,迪拜,141

阿联酋,迪拜,108

阿联酋,迪拜,266

澳大利亚,悉尼,141

澳大利亚,悉尼,122

澳大利亚,悉尼,153

澳大利亚,悉尼,128

澳大利亚,墨尔本,294

澳大利亚,墨尔本,230

澳大利亚,墨尔本,159

澳大利亚,墨尔本,188

澳大利亚,堪培拉,249

澳大利亚,堪培拉,378

澳大利亚,堪培拉,255

澳大利亚,堪培拉,240

I2=MAX(($A$2:$A$25=F2)($B$2:$B$25=G2)($C$2:$C$25=H2)$D$2:$D$25)

数组公式向下复制数组公式,公式输完后,光标放在公式编辑栏同时按下CTRL+SHIFT+回车键,使数组公式生效

以上就是关于mysql分组排序,取每组第一条数据全部的内容,包括:mysql分组排序,取每组第一条数据、oracle分组统计查询之后,获取数量最大的记录、查询news表 查询CategoryId=2 以Classifid分组 求出每组最新的2条数据,求高手写个SQL等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9531116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存