相关文章推荐
谦和的风衣  ·  iOS开发 ...·  1 年前    · 
闷骚的跑步鞋  ·  oracle ...·  1 年前    · 
飘逸的热带鱼  ·  菜鸟笔记 | 菜鸟教程·  1 年前    · 

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

完整的规则:

  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 
  t_seq 
WHERE num < 25)
SELECT * FROM t_seq

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

x0 AS 
(SELECT 
  CEIL(num / 5) AS group_no 
  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 
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 
GROUP BY group_no) 
SELECT 
  A, B, C, D, E 
 

最终的实现效果>>>

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.利用系统表 ;with t as(    SELECT            x = ROW_NUMBER() OVER            (ORDER BY s1.[object_id])        FROM       sys.objects AS s1        CROSS JOIN sys.objects AS...   没有现成方法,网上都用通用表表达式递归生成。今天想到一个还算简单的方法,记录下来: select row_number() over (order by (select 1)) from String_Split(space(6),' ')   生成1-7连续... 本文是“打印矩阵”系列的第三篇文章。我们再次把难度提升,使用 SQL 打印出如下表所示的矩阵。规则:使用 1~25 的数字依序填充矩阵;从第一行第一列开始填充,沿着列的方向进行。如果是奇数列,从上往下填;如果是偶数列,则从下往上填;第一列填满就到第列,再到第三列,直到把矩阵都填满。这个需求比前两篇的复杂度高,主要在于我们没法一下子看出每行数据出现的规律。没思路?没关系,继续往下看就是了。第一步,... 很久没怀疑过自己的智商了,直到遇见这 3 道题。你也来试试!这 3 道巨难的题目,来自 itpub 的 SQL 数据库编程大赛。说起 itpub 就不得不说它与 Oracle 的渊源,多少大师都在这里诞生。想成为 SQL 大师,有个最快的方法,就是刷题。如果能刷遍这里的题,Oracle 工作,十拿九稳。当年支付宝首席数据库架构师冯大-冯春培,就是典范。好了,闲话不说,上题!1,5X5方格棋盘难题在... 数据库 和 数据库管理系统 人们通常用数据库这个术语来代表他们使用的数据库软件,这是不正确的,也因此产生了许多混淆。确切地说,数据库软件应称为数据库管理系统( DBMS)。数据库是通过 DBMS 创建和操纵的容器,而具体它究竟是什么,形式如何,各种数据库都不一样。 表具有一些特性,这些特性定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名... 项目中使用了Apollo进行配置管理 application.properties中配置如下 spring.elasticsearch.jest.uris=${spring.elasticsearch.jest.uris} spring.elasticsearch.jest.read-timeout=${spring.elasticsearch.jest.read-timeout} sp... 转载地址:https://www.cnblogs.com/slowcity/p/11727579.html Elasticsearch Java API有四类client连接方式:TransportClient、 RestClient 、Jest、 Spring_Data_Elasticsearch。其中TransportClient、 RestClient是Elasticsearch原生的api,TransportClient会在8.0版本中完成删除,替代的是HighLevelRestClient,.. 什么是滚动查询? scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。 scroll查询允许我们 先做查询初始化,然后再批量地拉取结果。 这有点儿像传统数据库中的 游标(cursor) 。 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完处理完。 scrol... 完整版【es系列教程】,可移步公众号带着问题学习才高效1、Bool query 的子句有哪些类型?2、如何应用 Bool query?结合实际场景分析3、minimum_should_match 参数如何配置?ps:本文设计到的相关性评分,近期TeHero会专门讲解!本文知识导航图01 查询和过滤上下文在学习 Bool query 之前,我们应该先了解ES的两种上下文:1)Query conte...