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. HTML超链接实例介绍

    <html><head><title>第六节课</title><meta charset="UTF-8"></he ...

  2. UVA-101 The Blocks Problem 栈模拟

    终于AC了,这道题目去年寒假卡得我要死,最后一气之下就不做了...想想居然一年之久了,我本来都快忘了这道题了,最近发现白书的奥秘,觉得刘汝佳的题目真的相当练思维以及对代码的操作,决定又刷起题目来,这时 ...

  3. ZJNU 2342 - 夏华献要回家

    (夏华献在学校也要做一次梦!) 把5的答案手动算出 会发现从学校开始,兔子的数量呈斐波那契数列(第2项开始)增长 假如现在有n盏路灯 那么睡觉的时间可以得到为 但是n有1e18大,明显使用标准数学公式 ...

  4. 和我一起从0学算法(C语言版)(四)

    第三章 搜索 深度优先搜索与宽度优先搜索 定义 深度优先搜索(DFS) 过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 宽度优先搜索(BFS) 不考虑结果的可能位 ...

  5. chenzl

    大噶好!我是计算机6班的陈志良.我是一名代码小白.大一才刚接触代码,我发现我对编程兴趣挺大.特别是每周的代码作业,特别具有挑战性,每当我AC一道,我内心都会有自豪感和兴奋感,尽管过程有挫折,但我仍然坚 ...

  6. JQuery select,checkbox用法 文本框只能输入数字

    记录一下,方便查找 a.文本框只能输入数字 onkeyup='this.value=this.value.replace(/\D/gi,"")' eg: <input typ ...

  7. spring学习之spring入门

    一 spring的基础 1:什么是spring spring是由Rod Johnson组织和开发的一个分层 的Java SE/EE 一站式轻量级开源框架,它以Ioc(控制反转)和 AOP(面向切面编程 ...

  8. 分布式场景下Kafka消息顺序性的思考

    如果业务中,对于kafka发送消息异步消费的场景,在业务上需要实现在消费时实现顺序消费, 利用kafka在partition内消息有序的特点,消息消费时的有序性. 1.在发送消息时,通过指定parti ...

  9. ORB-SLAM2的编译运行以及TUM数据集测试

    ORB-SLAM2的编译运行以及TUM数据集测试 徐大徐 2018.02.06 17:04 字数 1838 阅读 2167评论 0喜欢 2 近段时间一直在学习高翔博士的<视觉SLAM十四讲> ...

  10. 使用mha 构建mysql高可用碰到几个问题

    根据网上配置,安装好mha ,建议到https://code.google.com/archive/p/mysql-master-ha/downloads  下载0.56版本 1.首先先确定各个主机之 ...