美文网首页
MySQL 轮换行值

MySQL 轮换行值

作者: 只是甲 | 来源:发表于2020-11-12 09:12 被阅读0次

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

返回每个员工的姓名和工资以及低于自己的最高工资和高于自己的最低工资。如果没有更高或最低的工资,则可能要求结果环绕(即第一个SAL显示最后一个SAL,反之亦然。)

要求输出如下:
+--------+---------+---------+---------+
| ename | sal | forward | rewind |
+--------+---------+---------+---------+
| SMITH | 800.00 | 950.00 | 5000.00 |
| JAMES | 950.00 | 1100.00 | 800.00 |
| ADAMS | 1100.00 | 1250.00 | 950.00 |
| WARD | 1250.00 | 1300.00 | 1100.00 |
| MARTIN | 1250.00 | 1300.00 | 1100.00 |
| MILLER | 1300.00 | 1500.00 | 1250.00 |
| TURNER | 1500.00 | 1600.00 | 1300.00 |
| ALLEN | 1600.00 | 2450.00 | 1500.00 |
| CLARK | 2450.00 | 2850.00 | 1600.00 |
| BLAKE | 2850.00 | 2975.00 | 2450.00 |
| JONES | 2975.00 | 3000.00 | 2850.00 |
| SCOTT | 3000.00 | 5000.00 | 2975.00 |
| FORD | 3000.00 | 5000.00 | 2975.00 |
| KING | 5000.00 | 800.00 | 3000.00 |
+--------+---------+---------+---------+

二.解决方案

2.1 子查询方法

使用标量子查询,找到相对于每个工资的下一档工资和上一当工资:

select  e.ename, e.sal,
        coalesce(
           (select min(sal) from emp d where d.sal > e.sal),
           (select min(sal) from emp)
        ) as forward,
        coalesce(
           (select max(sal) from emp d where d.sal < e.sal),
           (select max(sal) from emp)
        ) as rewind
    from emp e
order by 2;

测试记录

mysql> select  e.ename, e.sal,
    ->         coalesce(
    ->            (select min(sal) from emp d where d.sal > e.sal),
    ->            (select min(sal) from emp)
    ->         ) as forward,
    ->         coalesce(
    ->            (select max(sal) from emp d where d.sal < e.sal),
    ->            (select max(sal) from emp)
    ->         ) as rewind
    ->     from emp e
    -> order by 2;
+--------+---------+---------+---------+
| ename  | sal     | forward | rewind  |
+--------+---------+---------+---------+
| SMITH  |  800.00 |  950.00 | 5000.00 |
| JAMES  |  950.00 | 1100.00 |  800.00 |
| ADAMS  | 1100.00 | 1250.00 |  950.00 |
| WARD   | 1250.00 | 1300.00 | 1100.00 |
| MARTIN | 1250.00 | 1300.00 | 1100.00 |
| MILLER | 1300.00 | 1500.00 | 1250.00 |
| TURNER | 1500.00 | 1600.00 | 1300.00 |
| ALLEN  | 1600.00 | 2450.00 | 1500.00 |
| CLARK  | 2450.00 | 2850.00 | 1600.00 |
| BLAKE  | 2850.00 | 2975.00 | 2450.00 |
| JONES  | 2975.00 | 3000.00 | 2850.00 |
| SCOTT  | 3000.00 | 5000.00 | 2975.00 |
| FORD   | 3000.00 | 5000.00 | 2975.00 |
| KING   | 5000.00 |  800.00 | 3000.00 |
+--------+---------+---------+---------+
14 rows in set (0.00 sec)

2.2 MySQL 8.0 窗口函数方法

select ename ,sal ,
       coalesce(lead(sal) over w1,min(sal) over w2) forward,
       coalesce(lag(sal) over w1,max(sal) over w2) rewind
from emp
window w1 as (order by sal),
       w2 as ()
;

测试记录

mysql> select ename ,sal ,
    ->        coalesce(lead(sal) over w1,min(sal) over w2) forward,
    ->        coalesce(lag(sal) over w1,max(sal) over w2) rewind
    -> from emp
    -> window w1 as (order by sal),
    ->        w2 as ()
    -> ;
+--------+---------+---------+---------+
| ename  | sal     | forward | rewind  |
+--------+---------+---------+---------+
| SMITH  |  800.00 |  950.00 | 5000.00 |
| JAMES  |  950.00 | 1100.00 |  800.00 |
| ADAMS  | 1100.00 | 1250.00 |  950.00 |
| WARD   | 1250.00 | 1250.00 | 1100.00 |
| MARTIN | 1250.00 | 1300.00 | 1250.00 |
| MILLER | 1300.00 | 1500.00 | 1250.00 |
| TURNER | 1500.00 | 1600.00 | 1300.00 |
| ALLEN  | 1600.00 | 2450.00 | 1500.00 |
| CLARK  | 2450.00 | 2850.00 | 1600.00 |
| BLAKE  | 2850.00 | 2975.00 | 2450.00 |
| JONES  | 2975.00 | 3000.00 | 2850.00 |
| SCOTT  | 3000.00 | 3000.00 | 2975.00 |
| FORD   | 3000.00 | 5000.00 | 3000.00 |
| KING   | 5000.00 |  800.00 | 3000.00 |
+--------+---------+---------+---------+
14 rows in set (0.00 sec)

相关文章

  • MySQL 轮换行值

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • CSS flex-warp控制是否换行属性

    flex-warp属性值(控制是否换行) 值描述nowrap默认值。规定灵活的项目不拆行或不拆列。不换行,则收缩(...

  • django模板处理换行

    某个字段需要换行传值 后台: 模板:

  • 问题: MySQL使用零值时间所出现的问题

    问题: 问题:MySQL使用零值时间所出现的问题 MySQL版本 5.7.25MySQL不正确的日期时间值:'00...

  • 插值文本换行问题

    后端返回的字符串带有\n换行符,但Vue将其插值渲染成div内部文本后,文本并不换行,换行符显示为一个空格。下面是...

  • CSS3 - 文字自动换行

    word-break 属性用于设置换行规则。可选值有:1)normal:使用浏览器默认的换行规则。2)break-...

  • Java基础(十一)

    MySQL 索引 优化 插入 Mysql插入值,插入一个空行(前提为not null的列得有默认值) INSERT...

  • 你好你好

    测试测试这个是长什么样子的啊?换行换行换行换行换行换行换行换行换行换行行换行换行换行行换行换行换

  • MySQL处理换行符

    CHAR(10): 换行符CHAR(13): 回车符

  • 【CSS】文本换行的几个属性

    word-wrap:normal | break-word; (内容换行) normal:默认的属性值(允许内容顶...

网友评论

      本文标题:MySQL 轮换行值

      本文链接:https://www.haomeiwen.com/subject/ammkmktx.html