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. c语言中指向整型指针的指针的理解

    /************************************************************************* > File Name: ptr_ptr_i ...

  2. ubuntu16.04 pcl安装教程

    https://blog.csdn.net/zkj126521/article/details/80157351 https://blog.csdn.net/e_small/article/detai ...

  3. 【WPF学习】第三十七章 触发器

    WPF中有个主题,就是以声明方式扩展代码的功能.当使用样式.资源或数据绑定时,将发现即使不使用代码,也能完成不少工作. 触发器是另一个实现这种功能的例子.使用触发器,可自动完成简单的样式改变,而这通常 ...

  4. 打水滴(BFS)

    在一个n行m列的网格中,某些位置存在一些水滴.嘟嘟进行q次打水滴操作,每次嘟嘟在某一个网格当中添加一个水滴,当某一网格中的水滴数量超过L时,该网格中的水滴变为四个水滴,并分别向上下左右四个方向飞出,每 ...

  5. 你需要知道的 N 种抓取 dump 的工具

    原总结注册表debug调试dump转储文件windbgprocdump 前言 今天,向大家介绍几种可以抓取应用程序转储文件的工具及基本使用方法.更详细的用法,请参考每个工具对应的帮助文档.如果你还不清 ...

  6. HNOI2018/AHOI2018 游戏

    这题放过了暴力其实就没啥意思了 虽然暴力复杂度很玄学,但是思维水平确实没啥 Description link 题意概述:现在有一条长度为 \(n\) 的链,有些边是有限制的 限制为能到某个点,才能经过 ...

  7. App 性能测试

    app常见性能测试点: https://blog.csdn.net/xiaomaoxiao336368/article/details/83547318

  8. upstream实现内网网站在公网访问

    背景描述:公司内网有个网站aa.com,B部门需要访问这个aa.com,但是网站部署在内网服务器(服务器是192.168.1网段),B部门网段是192.168.100 需求描述:B部门需要访问aa.c ...

  9. 几个Java基础题

    1.java中线程能不能重复start t1.start();        System.out.println("ssss");        t1.start(); 答:第一 ...

  10. cat命令的一个用法

    1:  cat 1.txt 2.txt 3.txt > 4.txt  这个操作可以把前三个文件的内容全部复制到第四个文件中去