MySQL分组排序(取第一或最后)

方法一:速度非常慢,跑了30分钟

SELECT
custid,
apply_date,
rejectrule
FROM
(
SELECT
*,
IF
( @pkey <> custid, @rank := 1, @rank := @rank + 1 ) AS rank,
@pkey := custid
FROM
(
SELECT
custid,
createTime,
SUBSTR( createTime, 1, 10 ) AS apply_date,
rejectRule,
STATUS
FROM
(
SELECT
*
FROM
credit.`apply`
WHERE
SUBSTR( createTime, 1, 10 ) >= '2019-10-26'
AND custid <> ""
AND SUBSTR( custid, 1, 2 ) = ''
) t1,
( SELECT @pkey := 0, @rank = 0 ) t2
) t
ORDER BY
custid,
createTime DESC
) a
HAVING
rank = 1
AND STATUS <> 1 LIMIT 100;

方法二:非常快,约为1分钟

SELECT
custid,
apply_date,
rejectrule ,
STATUS
FROM
(
SELECT
custid,
apply_date,
rejectrule,
STATUS
FROM
(
SELECT
custid,
CASE
WHEN locate( '|', statuss ) > 0 THEN
SUBSTR( statuss, 1, INSTR( statuss, '|' )- 1 ) ELSE statuss
END AS STATUS,
CASE
WHEN locate( '|', apply_dates ) > 0 THEN
SUBSTR( SUBSTR( apply_dates, 1, INSTR( apply_dates, '|' )- 1 ), 1, 10 ) ELSE SUBSTR( apply_dates, 1, 10 )
END AS apply_date,
CASE
WHEN locate( '|', rejectrules ) > 0 THEN
SUBSTR( rejectrules, 1, INSTR( rejectrules, '|' )- 1 ) ELSE rejectrules
END AS rejectrule
FROM
(
SELECT
custid,
group_concat( STATUS ORDER BY createTime DESC SEPARATOR '|' ) AS statuss,
group_concat( SUBSTR( createTime, 1, 10 ) ORDER BY createTime DESC SEPARATOR '|' ) AS apply_dates,
group_concat( rejectrule ORDER BY createTime DESC SEPARATOR '|' ) AS rejectrules
FROM
credit.`apply`
WHERE
SUBSTR( createTime, 1, 10 ) >= '2019-07-26'
AND custid <> ""
AND SUBSTR( custid, 1, 2 ) = ''
GROUP BY
custid
) t
) tt
) b
WHERE
apply_date >= '2019-10-12'
AND STATUS <> 1 LIMIT 100;

因为可能数据很多group_concat()可能会超长,解决方案见博客

方法三:

MySQL新版本已经支持窗口函数:mysql8.0

select custid,createTime,status,rejectrule
(
SELECT RANK() OVER (PARTITION BY custid ORDER BY createTime desc ) AS rank1,
custid,
createTime ,
status,
rejectrule
FROM credit.apply
) T
where rank1=1;

MySQL分组排序(取第一或最后)的更多相关文章

  1. mysql分组排序取最大值所在行,类似hive中row_number() over partition by

    如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) sel ...

  2. mysql 分组排序取最值

    查各个用户下单最早的一条记录 查各个用户下单最早的前两条记录 查各个用户第二次下单的记录 一.建表填数据: SET NAMES utf8mb4; -- 取消外键约束 ; -- ------------ ...

  3. mysql 分组排序前n + 长表转宽表

    MySQL数据库优化的八种方式(经典必看) 建表 CREATE TABLE if not EXISTS `bb` ( `id` int not null primary key auto_increm ...

  4. mysql分组排序加序号(不用存储过程,就简简单单sql语句哦)

    做前端好长时间了,好久没动sql了.在追一个喜欢的女孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表.... 一 建表 CREATE TABLE `my_te ...

  5. mySql分组排序

    mysql 排序学习---mysql 1.建表语句 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varc ...

  6. SQL之分组排序取top n

    转自:http://blog.csdn.net/wguangliang/article/details/50167283 要求:按照课程分组,查找每个课程最高的两个成绩. 数据文件如下: 第一列no为 ...

  7. MYSQL 分组排序

    http://www.cnblogs.com/merru/articles/4626045.html SELECT a.shop_id, a.price, count(*) as rankFROM m ...

  8. mysql 分组后取每个组内最新的一条数据

    首先,将按条件查询并排序的结果查询出来. mysql order by accepttime desc; +---------------------+------+-----+ | acceptti ...

  9. [转] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

    前言:        同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.        oracle里面可以通过row_number() OVER (PARTITIO ...

随机推荐

  1. 权限管理ranger

    为超级管理员airflow赋权: 在ranger 中的hive中加入root policy, url policy 在hdfs中加入/ 的poclicy 你如果需要自动ldap同步,时间1小时,ran ...

  2. oracle管道函数的用法(一行拆为多行)

    oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合 如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline funct ...

  3. python基础学习记录......

    1.IDEA写python 打开IDEA,File--->settings---->Plugins    输入python  安装   重启IDEA 2.新建Project     选择P ...

  4. java poi3.10.1基本excel使用

    效果: 代码: //时间 String checkTime = "yyyy/MM/dd"; //人员查询 Set preParticipantNames = new HashSet ...

  5. SAS学习笔记18 length、lengthn、lengthc函数

  6. JS 03事件

    <script type="text/javascript"> function getUserInput() { //获取用户输入的内容 var val = docu ...

  7. jq勾选

    1.取消勾选 $("box").attr("checked", false); 2.勾选 $("kbox").attr("chec ...

  8. 2019牛客多校四 E. triples II (容斥)

    大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...

  9. 数据仓库之抽取数据:通过bcp命令行导入数据

    原文:数据仓库之抽取数据:通过bcp命令行导入数据 在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区中的数据进行转换,最后 ...

  10. VS2019打开项目加载失败:无法找到 .NET Core SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配。

    问题描述: 用VS2019创建了asp.net core项目,正常运行:过几天后,再次打开,发现无法加载项目,报错无法找到.net core sdk.   分析过程: 首先怀疑环境变量的问题,重新设置 ...