mysql有没有开窗函数_mysql实现开窗函数

mysql实现开窗函数

开窗分析函数简单来讲就是相似partition by aaa, bbb order by ccc这样的形式mysql

在使用mysql的过程当中遇到过这样的需求,须要求出一段时间内每一个item的最大值及对应的那一条记录。最大值很容易使用group by item求出来,可是求出那一条对应的全部字段及值却很差实现。通过查资料及探索发现mysql也能够实现,思路是人为构造一个字段来标记顺序,这样不只能实现最大,还能实现TOP N。记录下简单示例:sql

准备数据

# 建表

CREATE TABLE `policy_summary` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`policy_name` varchar(18) COLLATE utf8_bin DEFAULT NULL,

`publish_time` datetime DEFAULT NULL,

`platform_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

)

# 插入数据

INSERT INTO `policy_summary` VALUES ('1', 'test0', '2019-04-01 15:11:00', '2');

INSERT INTO `policy_summary` VALUES ('2', 'test9', '2019-04-01 19:11:00', '2');

INSERT INTO `policy_summary` VALUES ('3', 'test8', '2019-04-01 19:11:00', '2');

INSERT INTO `policy_summary` VALUES ('4', 'test7', '2019-04-01 18:11:00', '2');

INSERT INTO `policy_summary` VALUES ('5', 'test1', '2019-04-01 15:11:00', '2');

INSERT INTO `policy_summary` VALUES ('6', 'test2', '2019-04-01 15:11:00', '2');

INSERT INTO `policy_summary` VALUES ('7', 'test3', '2019-04-01 16:11:00', '2');

INSERT INTO `policy_summary` VALUES ('8', 'test4', '2019-04-01 16:11:00', '2');

INSERT INTO `policy_summary` VALUES ('9', 'test5', '2019-04-01 16:11:00', '2');

INSERT INTO `policy_summary` VALUES ('10', 'test6', '2019-04-01 17:11:00', '2');

INSERT INTO `policy_summary` VALUES ('11', 'fengyu', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('12', '新建政策1111111', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('13', '1218测试', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('14', 'xxx', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('15', 'ccc', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('16', '测试114', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('17', '测试mmm', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('18', 'kkkkkkk', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('19', 'kkkkkkk明明', '2019-04-02 19:17:00', '8');

INSERT INTO `policy_summary` VALUES ('20', 'ceshi111', '2019-04-02 19:17:00', '8');

# 查看

mysql> select * from policy_summary;

+----+-----------------+---------------------+-------------+

| id | policy_name | publish_time | platform_id |

+----+-----------------+---------------------+-------------+

| 1 | test0 | 2019-04-01 15:11:00 | 2 |

| 2 | test9 | 2019-04-01 19:11:00 | 2 |

| 3 | test8 | 2019-04-01 19:11:00 | 2 |

| 4 | test7 | 2019-04-01 18:11:00 | 2 |

| 5 | test1 | 2019-04-01 15:11:00 | 2 |

| 6 | test2 | 2019-04-01 15:11:00 | 2 |

| 7 | test3 | 2019-04-01 16:11:00 | 2 |

| 8 | test4 | 2019-04-01 16:11:00 | 2 |

| 9 | test5 | 2019-04-01 16:11:00 | 2 |

| 10 | test6 | 2019-04-01 17:11:00 | 2 |

| 11 | fengyu | 2019-04-02 19:17:00 | 8 |

| 12 | 新建政策1111111 | 2019-04-02 19:17:00 | 8 |

| 13 | 1218测试 | 2019-04-02 19:17:00 | 8 |

| 14 | xxx | 2019-04-02 19:17:00 | 8 |

| 15 | ccc | 2019-04-02 19:17:00 | 8 |

| 16 | 测试114 | 2019-04-02 19:17:00 | 8 |

| 17 | 测试mmm | 2019-04-02 19:17:00 | 8 |

| 18 | kkkkkkk | 2019-04-02 19:17:00 | 8 |

| 19 | kkkkkkk明明 | 2019-04-02 19:17:00 | 8 |

| 20 | ceshi111 | 2019-04-02 19:17:00 | 8 |

+----+-----------------+---------------------+-------------+

根据platform_id,publish_time分组并根据policy_name排序

SELECT

a.platform_id,

a.publish_time,

a.policy_name,

a.id,

IF (

@str1 = a.platform_id

AND @str2 = a.publish_time,

@rank := @rank + 1,

@rank := 1

) AS rank_no,

@str1 := a.platform_id,

@str2 := a.publish_time

FROM

(

SELECT

platform_id,

publish_time,

policy_name,

id

FROM

policy_summary

ORDER BY

platform_id,

publish_time,

policy_name ASC

) a,

(

SELECT

@str1 := 0,

@str2 := NULL,

@rank := 0

) tmp

# 查询结果

+-------------+---------------------+-----------------+----+---------+------------------------+-------------------------+

| platform_id | publish_time | policy_name | id | rank_no | @str1 := a.platform_id | @str2 := a.publish_time |

+-------------+---------------------+-----------------+----+---------+------------------------+-------------------------+

| 2 | 2019-04-01 15:11:00 | test0 | 1 | 1 | 2 | 2019-04-01 15:11:00 |

| 2 | 2019-04-01 15:11:00 | test1 | 5 | 2 | 2 | 2019-04-01 15:11:00 |

| 2 | 2019-04-01 15:11:00 | test2 | 6 | 3 | 2 | 2019-04-01 15:11:00 |

| 2 | 2019-04-01 16:11:00 | test3 | 7 | 1 | 2 | 2019-04-01 16:11:00 |

| 2 | 2019-04-01 16:11:00 | test4 | 8 | 2 | 2 | 2019-04-01 16:11:00 |

| 2 | 2019-04-01 16:11:00 | test5 | 9 | 3 | 2 | 2019-04-01 16:11:00 |

| 2 | 2019-04-01 17:11:00 | test6 | 10 | 1 | 2 | 2019-04-01 17:11:00 |

| 2 | 2019-04-01 18:11:00 | test7 | 4 | 1 | 2 | 2019-04-01 18:11:00 |

| 2 | 2019-04-01 19:11:00 | test8 | 3 | 1 | 2 | 2019-04-01 19:11:00 |

| 2 | 2019-04-01 19:11:00 | test9 | 2 | 2 | 2 | 2019-04-01 19:11:00 |

| 8 | 2019-04-02 19:17:00 | 1218测试 | 13 | 1 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | ccc | 15 | 2 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | ceshi111 | 20 | 3 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | fengyu | 11 | 4 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | kkkkkkk | 18 | 5 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | kkkkkkk明明 | 19 | 6 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | xxx | 14 | 7 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | 新建政策1111111 | 12 | 8 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | 测试114 | 16 | 9 | 8 | 2019-04-02 19:17:00 |

| 8 | 2019-04-02 19:17:00 | 测试mmm | 17 | 10 | 8 | 2019-04-02 19:17:00 |

+-------------+---------------------+-----------------+----+---------+------------------------+-------------------------+

这样rank_no就是那个标志排序的字段,若是要求最大policy_name的记录就只须要加一个过滤条件rank_no <= 1便可函数

SELECT

t.platform_id,

t.publish_time,

t.policy_name,

t.rank_no,

t.id

FROM

(

SELECT

a.id,

a.platform_id,

a.publish_time,

a.policy_name,

IF (

@str1 = a.platform_id

AND @str2 = a.publish_time,

@rank := @rank + 1,

@rank := 1

) AS rank_no,

@str1 := a.platform_id,

@str2 := a.publish_time

FROM

(

SELECT

id,

platform_id,

publish_time,

policy_name

FROM

policy_summary

ORDER BY

platform_id,

publish_time,

policy_name ASC

) a,

(

SELECT

@str1 := 0,

@str2 := NULL,

@rank := 0

) tmp

) t

WHERE

t.rank_no <= 1

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 格式化时间计算

package com.roshi.utils.common;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class DateUtilsCom {/*** 格式化时间 * param date* return* author lzq* throws ParseException * date 2016年…

微信小程序点播插件_微信小程序 wxParse插件显示视频问题

修改wxParse/html2json.js 文件 &#xff0c;在 html2json(html, bindName)方法里var node {node: element,tag: tag,};这里使用 node.tag 能够获取标签类型&#xff0c;比如&#xff1a; img、embed、video这里我的系统后台编辑器使用的是ckeditor 上传视频。生成的便签是&am…

GridView - Batch Editing - How to cancel editing or disable the editor conditionally

Please refer to :https://www.devexpress.com/Support/Center/Example/Details/T115116转载于:https://www.cnblogs.com/michelledawm/p/5980940.html

linkerd mysql_Linkerd和k8s无法正常工作

我试图让我的头在kubernetes的链接。我在我的本地minikube中使用他们网站上的linkerd deamonset示例它全部部署在production命名空间中。当我尝试http_proxy$(kubectl --namespaceproduction get svc l5d -o jsonpath"{.status.loadBalancer.ingress[0].*}"):4140 cu…

mssql 跨库获取mysql

exec sp_addlinkedserver serverMYSQL, --这是链接服务器的名称 srvproductmysql, --这个你自己随便吧 providerMSDASQL, --这是固定的&#xff0c;不能瞎填&#xff0c;否则死定了 datasrcmyserver, --这是ODBC里面data source name,系统DNS locationNULL, provstrDRIVER{MyS…

mysql standalone模式_Boss7 Standalone模式开发配置

PS&#xff1a;以下配置均添加到standalone.xml文件中。1.Get请求编码设置&#xff0c;将如下配置添加到标签之后2.开启开发模式&#xff1a;搜索“urn:jboss:domain:web:1.1”&#xff0c;在此标签下添加如下配置&#xff1a;3.虚拟域名设置搜索“urn:jboss:domain:web:1.1”&…

机器学习笔记——深度学习入门篇

前向传播与反向传播转载于:https://www.cnblogs.com/hdu-cpd/p/5988606.html

java 模板模式_Java模板模式(Template模式)

Java模板模式(Template模式)下一节>Template模式定义&#xff1a;定义一个操作中算法的骨架&#xff0c;将一些步骤的执行延迟到其子类中。其实Java的抽象类本来就是Template模式&#xff0c;因此使用很普遍。而且很容易理解和使用&#xff0c;我们直接以示例开始&#xff1…

python ide: pycharm

1, 设置python路径 2&#xff0c;运行py文件 https://www.jetbrains.com/help/pycharm/2016.1/creating-and-running-your-first-python-project.html#d50296e226 3, 格式化代码 From the main menu, select Code | Reformat Code or press CtrlAltL. 转载于:https://www.cnblo…

pandas入门(2)

使用dataframe的列当做索引 frame DataFrame({a:range(7),b:range(7,0,-1),c:[one,one,one,two,two,two,two],d:[0,1,2,0,1,2,3]}) frame.set_index([c,d]) a b c d one 0 0 7 1 1 6 2 2 5 two 0 3 4 1 4 3 2 5 2 3 6 1 可以使用frame.set_index([c,d]&#xff0c;dropFalse)将…

IP地址框

//IP地址框 // 此段代码&#xff1a;独立的获取本机IP地址和计算机名 WORD wVersionRequested; WSADATA wsaData; char name[255]; CString ip; PHOSTENT hostinfo; wVersionRequested MAKEWORD(2, 0); if (WSAStartup(wVersionRequested, &wsaData) 0) { if(ge…

java 释放数组_java集合ArrayList中clear方法内存释放分析

最近在看ArrayList源码的时候看到了ArrayList的clear方法&#xff0c;源码如下&#xff1a;public void clear() {modCount;// clear to let GC do its workfor (int i 0; i < size; i)elementData[i] null;size 0;}在看到这段代码的时候联想到内存释放的问题如下代码&am…

Android 滑动菜单框架--SwipeMenuListView框架完全解析

SwipeMenuListView&#xff08;滑动菜单&#xff09; A swipe menu for ListView.--一个非常好的滑动菜单开源项目。 Demo 一、简介 看了挺长时间的自定义View和事件分发&#xff0c;想找一个项目练习下。。正好印证自己所学。 在github上找到了这个项目&#xff1a;SwipeMenuL…

【Web网站服务器开发】Apache 和 Tomcat的区别及配置

Apache 和 Tomcat 都是web网络服务器&#xff0c;两者既有联系又有区别&#xff0c;在进行HTML、PHP、JSP、Perl等开发过程中&#xff0c;需要准确掌握其各自特点&#xff0c;选择最佳的服务器配置。 apache是web服务器&#xff08;静态解析&#xff0c;如HTML&#xff09;&…

java字符生成器_Java实现简单字符生成器代码例子

创建成功的字符串对象&#xff0c;其长度是固定的&#xff0c;内容是不能被修改和编辑。虽然使用""可以达到增加新字符或字符串的目的&#xff0c;但""会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改&#xff0c;将极…

ES基础知识

马克。。。转载于:https://www.cnblogs.com/lirunzhou/p/6012321.html

java nio copy_使用NIO快速复制Java文件

package com.test.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.channels.FileChannel;/*** 使用NIO快速复制Java文件** author Administrator**/public class FileCopy {SuppressWa…

2016年10月30日表单标签与样式表分类和选择器

今天上午讲的表单标签 <form name"表单"method"get" action"Untitled-2.html"> <!--get地址栏可以看到值&#xff0c;post不可以--> <input type"text" name"姓名" value"" />姓名 <!--文本…

java jframe 设置背景图片_JFrame如何设置背景图片

代码&#xff1a;import java.awt.FlowLayout;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class JFrameBackground {private JFrame frame new JFrame("背景图片测…

Linux运维操作

http://www.it165.net/os/html/201204/1909.html https://i.cnblogs.com/EditPosts.aspx?opt1 http://www.it165.net/os/html/201204/1877.html http://blog.chinaunix.net/uid-28718792-id-3556036.html 转载于:https://www.cnblogs.com/diyunpeng/p/6014729.html