mysql8 已经支持开窗函数 https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

————————————————

sql server 的开窗函数

http://www.cnblogs.com/zihunqingxin/p/3638857.html

mysql8 之前的版本不支持开窗函数

目的,取每个channel 按created_on 倒序排的前20条

示例如下(有部分冗余数据)

select id,url,channel,created_on,rank
from(
select id,url,channel,created_on,rank
from (select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=article_tmp.channel
from (
select id,url,channel,created_on
from article order by channel asc ,created_on desc
) article_tmp ,
(select @rownum :=0 , @pdept := null ,@rank:=0) a
) result
)t where rank<=20;

最核心的部分是

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=article_tmp.channel
from (
select id,url,channel,created_on
from article order by channel asc ,created_on desc
) article_tmp

原理是按channel 和 created_on 排序

两个临时变量

pdept

rank

pdept 指向channel

游标(这么说不准确,就是个遍历的过程)下移的过程中

pdept 未变,则rank++

若pdept 变化,则表示是新的channel  rank归0

最后按取rank 的top N条数据 即可

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=article_tmp.channel
from (
select id,url,channel,created_on
from article order by channel asc ,created_on desc
) article_tmp

mysql 实现类似开窗函数的功能的更多相关文章

  1. SQLServer 中实现类似MySQL中的group_concat函数的功能

    SQLServer中没有MySQL中的group_concat函数,可以把分组的数据连接在一起. 后在网上查找,找到了可以实现此功能的方法,特此记录下. SELECT a, stuff((SELECT ...

  2. (MariaDB)开窗函数用法

    本文目录: 1.1 窗口和开窗函数简介 1.2 OVER()语法和执行位置 1.3 row_number()对分区排名 1.4 rank()和dense_rank() 1.5 percent_rank ...

  3. 通过自关联替代开窗函数实现SQL优化

    数据库环境:SQL SERVER 2005 我们平时都是通过开窗析函数来取代自关联,减少表扫描,从而优化SQL.今天,反其道而行, 用自关联改写开窗函数.我们先来看一下SQL. 原SQL语句 SELE ...

  4. mysql为何不支持开窗函数?

    引用 在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题,非常多都要通过复杂的相关子查询或者存储过程来完毕.为了解决这些问题,在2003年ISO SQL标准增加了开窗函数,开窗函数的使用使 ...

  5. mysql定时执行及延时执行,实现类似sql server waitfor功能

    熟悉SQL Server的人都知道,它有一个很有用的功能,waitfor time和waitfor delay,前者表示在某个时间执行,后者表示等待多长时间执行.在我们测试功能和定时执行的时候特别有用 ...

  6. mysql实现开窗函数

    mysql实现开窗函数 http://blog.itpub.net/29989552/viewspace-2123077/ 学习过oracle的应该知道,oracle中的分析函数功能十分强大,包括ms ...

  7. js 实现类似php函数number_format的功能

    今天同事在做一个功能的时候需要使用js来实现类似php函数number_format的功能,最后就有了下面的方法,可以实现了: /** * number_format * @param number ...

  8. mysql实现开窗函数、Mysql实现分析函数

    关键字:mysql实现开窗函数.Mysql实现分析函数.利用变量实现窗口函数 注意,变量是从左到右顺序执行的 --测试数据 CREATE TABLE `tem` ( `id` ) NOT NULL A ...

  9. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询

    连接查询 inner join,用的最多,表示多张表一一对应 聚合函数 操作行数据,进行合并 sum.avg.count.max.min 开窗函数 将合并的数据分布到原表的每一行,相当于多出来了一列, ...

随机推荐

  1. winform屏蔽鼠标右键

    /// <summary> /// 屏蔽右键 /// </summary> internal class MenuHandler : IContextMenuHandler { ...

  2. winform操作windows系统计算器

    winform对系统计算器的调用,启动,最大化最小化显示,在mainwindow设置topmost=true时,正常显示计算器并置顶. /// <summary> /// 获取窗体的句柄函 ...

  3. VUE- iView组件框架的使用

    VUE- iView组件框架的使用 1. 下载iView 工程. 引用:https://www.iviewui.com/

  4. PAT Advanced 1004 Counting Leaves (30) [BFS,DFS,树的层序遍历]

    题目 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family mem ...

  5. opencv显示图像

    使用imshow函数 imshow函数功能 imshow的函数功能也非常简单,名称也可以看出来,image show的缩写.imshow负责的就是将图片显示在窗口中,通过设备屏幕展现出来.与imrea ...

  6. 阿里云-容器服务之集群服务 k8s(Jenkins+gitlab+k8s的devops)- 01

    由于docker官方停止更新Swarm,另外swarm在使用期间出现了很多bug,所以阿里云也在2019年7月发布公告:于2019年12月31日起停止技术支持,请您尽快迁移至容器服务Kubernete ...

  7. MVC思想概叙

    随着应用系统的逐渐增大,系统的业务逻辑复杂度是以几何的方式增长,在这种情况下,如果依然把所有的业务逻辑都放在JSP页面中,那将成为一场恶梦. MVC思想将应用中各个组件按照功能来进行分类,不同的组将使 ...

  8. 初识API网关,API-gateway

    1.API-gateway(含义) 所有API的调用统一接入API网关层,由网关层负责接入和输出. API Gateway是一个服务器,也可以说是进入系统的唯一节点.这跟面向对象设计模式中的Facad ...

  9. Python笔记_第三篇_面向对象_1.面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  10. jquery选择器之获取父级元素、同级元素、子元素

    一.获取父级元素 1. parent([expr]): 获取指定元素的所有父级元素 二.获取同级元素: 1.next([expr]): 获取指定元素的下一个同级元素 2.nextAll([expr]) ...