zoukankan      html  css  js  c++  java
  • mysql 组内排序(分组之前排序,如分组取最新时间的数据)

    Oracle、SQL server数据库的分组排序函数rank()over()、row_number()over()、dense_rank()over()

    MySQL没有这三个函数。

    sql执行顺序图

    1.利用group_concat()函数内置的order by分组排序属性

    group_concat()函数完整语法

    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段[Separator '分隔符'])

    -- GROUP_CONCAT 默认长度限制是1024 默认分隔符','
    -- group_column  分组字段
    -- required_out_group_column 需要排序的非分组字段。如按大楼楼层分组,每个楼层最晚到班的人的姓名或者到班时间
    -- 分组排序查询某个字段
    SELECT group_column, 
    SUBSTRING_INDEX(GROUP_CONCAT(required_out_group_column ORDER BY order_time DESC SEPARATOR ','), ',', 1) AS require_column1
    FROM table_name  GROUP BY group_column
    
    -- 分组排序查询所有字段
    SELECT t1.*, t2.stu_name FROM test t1 RIGHT JOIN 
    (SELECT stu_name, GROUP_CONCAT(id ORDER BY RECORD_TIME DESC) order_id FROM test GROUP BY stu_name)  t2 
    ON t1.stu_name = t2.stu_name AND 
    FIND_IN_SET(t1.id, t2.order_id) = 1
    -- <=>
    -- t1.id = SUBSTRING_INDEX(t2.order_id,',',1) 

    2.

    SELECT * FROM 
    
    (SELECT t1.*, t2.product_id pid FROM 
     tb_group_order t1
     LEFT JOIN tb_group_order t2 ON t1.id = t2.id
    -- **    
     HAVING 1
     ORDER BY t2.record_time DESC)  t GROUP BY t.pid

    Mysql 取分组后时间最大的一整条数据 及一些分组后取出每天最大时间一条

    3. 利用变量赋值

    ...

    https://blog.51cto.com/mrcelite/745913

    4.利用内连接,比较待排序列,统计比较结果

    ...

  • 相关阅读:
    链表的头指针
    顺时针打印矩阵
    旋转数组的最小数字
    实现string类
    最长对称子串
    DFS和BFS
    最长公共子序列
    排序算法
    大端与小端
    交换两个数
  • 原文地址:https://www.cnblogs.com/foolash/p/14326258.html
Copyright © 2011-2022 走看看