专栏首页SQL实现SQL 打印矩阵(二)

SQL 打印矩阵(二)

我们在上一篇文章SQL 打印矩阵 (一)中介绍了怎么用 SQL 打印 5 x 5 的矩阵,今天的内容仍旧围绕这个主题,只不过规则稍有点不同。

先来看看要实现的效果。

A

B

C

D

E

1

2

3

4

5

10

9

8

7

6

11

12

13

14

15

20

19

18

17

16

21

22

23

24

25

和前面一篇文章中的表格不同之处在于:偶数行的排序不再是从左到右是递增的,而是递减,或者说是从右到左递增。

完整的规则:

  1. 有一张 5 x 5 的表格,我们要往这张表格中填充 1~25 的数字;
  2. 如果是奇数行,则从左到右填充数字;如果是偶数行,就需要按从右到左的顺序填入数字。
  3. 先从表格的左上角(即第一行第一列)填入数字 “1”,在第一行第二列填入“2”,直到把第一行填满;
  4. 当上一行填满的时候,就开始往下一行填数据。比如,第二行要从右往左依次填入“6”、“7”、“8”、“9”、“10”。
  5. 循环反复,直到所有空格都填满数字。

接下来,我们将实现这个需求。

第一步,生成 1~25 的数。

WITH recursive t_seq (num) AS 
(SELECT 
  1 AS num 
UNION ALL 
SELECT 
  num + 1 AS num 
FROM
  t_seq 
WHERE num < 25)

SELECT * FROM t_seq

第二步,生成每个数对应的组号/行号。

x0 AS 
(SELECT 
  num,
  CEIL(num / 5) AS group_no 
FROM
  t_seq)

SELECT * FROM x0

第三步,动态排序。

若是奇数行,则组内默认按升序排序,反之,则是降序排序。

使用 IF(是偶数行, - 1 * 原排序字段, 原排序字段) AS 新排序字段 可以达到依据条件实现动态排序的效果。

x1 AS 
(SELECT 
  *,
  IF(group_no % 2 = 0, - 1 * num, num) AS ordered,
  row_number () over () AS seq 
FROM
  x0 
ORDER BY group_no,
  ordered)

SELECT * FROM x1

注意,我们在 SQL 中加入了一个新字段 seq,seq 存储的是 1~25 的自然数,它将作为后面步骤的行转列的依据。

执行上面的 SQL ,部分结果如下。

   num  group_no  ordered     seq  
------  --------  -------  --------
     1  1               1         1
     2  1               2         2
     3  1               3         3
     4  1               4         4
     5  1               5         5
    10  2             -10         6
     9  2              -9         7
     8  2              -8         8
     7  2              -7         9
     6  2              -6        10

第四步,行转列。

x2 AS 
(SELECT 
  group_no AS row_no,
  MAX(IF(seq % 5 = 1, num, NULL)) AS A,
  MAX(IF(seq % 5 = 2, num, NULL)) AS B,
  MAX(IF(seq % 5 = 3, num, NULL)) AS C,
  MAX(IF(seq % 5 = 4, num, NULL)) AS D,
  MAX(IF(seq % 5 = 0, num, NULL)) AS E 
FROM
  x1 
GROUP BY group_no) 

SELECT 
  A, B, C, D, E 
FROM
  x2

最终的实现效果>>>

     A       B       C       D       E  
------  ------  ------  ------  --------
     1       2       3       4         5
    10       9       8       7         6
    11      12      13      14        15
    20      19      18      17        16
    21      22      23      24        25

封面图片由Monika Grafik在Pixabay上发布。

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL 打印矩阵 (一)

    使用 SQL 输出 5 x 5 的矩阵,矩阵的值由 1~25 填充,实现的效果如下表所示。

    白日梦想家
  • python 打印矩阵

    py3study
  • 打印锯齿矩阵

    锯齿矩阵是指每一行包含的元素个数不相同的矩阵,比如: 1 3 5 2 6 1 2 2 3 4 3 1 6 2 7 读入若干对整数 (...

    Enterprise_
  • [剑指offer] 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

    尾尾部落
  • Day19:顺时针打印矩阵

    思路一:   本题可以采取记录最外圈四个角的位置方法,当满足左右间距大于1时,上下间距大于1时,每次剥下一圈,将四个角都往内移一位,在判断是否满足条件;当不满...

    一计之长
  • 打印矩阵、机器人、菜单

    int main(void) { printf("n"); printf("1 2 3 4n5 6 7 8n9 10 11 12n13 14 15 16n...

    WindCoder
  • 剑指Offer_Java_顺时针打印矩阵(二维数组)

    简单来说,就是不断地收缩矩阵的边界 定义四个变量代表范围,up(初始0)、down(初始-行高)、left(初始-0)、right(初始-列宽), 向右...

    CherishTheYouth
  • 剑指offer 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 1...

    week
  • 【剑指Offer】顺时针打印矩阵

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2:

    小新哟
  • 剑指offer--顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13...

    AI那点小事
  • 剑指offer - 顺时针打印矩阵 - JavaScript

    题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 ...

    心谭博客
  • 【剑指Offer】29. 顺时针打印矩阵

    下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10

    瑞新
  • Sword To Offer 019 - 顺时针打印矩阵

    Reck Zhang
  • 矩阵分析(十二)正规矩阵、Hermite矩阵

    定义:设 $A, B \in \mathbb{C}^{n \times n}\left(\right. 或 \left.\mathbb{R}^{n \tim...

    mathor
  • [PHP] 算法-顺时针打印矩阵的PHP实现

    陶士涵
  • 剑指OFFER之顺时针打印矩阵(九度OJ1391)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

    用户1154259
  • 利用python中的matplotlib打印混淆矩阵实例

    前面说过混淆矩阵是我们在处理分类问题时,很重要的指标,那么如何更好的把混淆矩阵给打印出来呢,直接做表或者是前端可视化,小编曾经就尝试过用前端(D5)做出来,然后...

    砸漏
  • 每天一道剑指offer-顺时针打印矩阵

    今天的题目 每天的题目见github(看最新的日期): https://github.com/gzc426 具体的题目可以去牛客网对应专题去找。

    乔戈里
  • 每日一起 剑指offer (顺时针打印矩阵)

    编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化...

    小白学视觉

扫码关注云+社区

领取腾讯云代金券