添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  1. 使用 1~25 的数字依序填充矩阵;
  2. 从第一行第一列开始填充,沿着列的方向进行。如果是奇数列,从上往下填;如果是偶数列,则从下往上填;
  3. 第一列填满就到第二列,再到第三列,直到把矩阵都填满。

这个需求比前两篇的复杂度高,主要在于我们没法一下子看出每行数据出现的规律。

没思路?没关系,继续往下看就是了。

第一步,生成 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

第二步,计算出每个数对应的列号。

从表上就可以看出,每个数字除于 5,再对结果向上取整就是该数字所在的列。

x0 AS 
(SELECT 
  CEIL(num / 5) AS col_no 
  t_seq)
SELECT * FROM X0
 

第三步,对偶数列做降序排序。

到现在我们仍旧没有找到每一行数字出现的规律。不过,我们可以试着把每列中的数字按照我们看到的顺序排好序。

比如,第一列是“1,2,3,4,5”,第二列是“10,9,8,7,6”,第三列是“11,12,13,14,15”。

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

上面的 SQL 执行的结果(部分) >>>

num  col_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

在这个结果里面,我们发现了数字字段 num 和序号字段 seq 之间存在某种联系:seq % 5 得到的结果一致的 num 处在同一行上。

第四步,行转列。

既然已找到了分组的依据,剩下要做的就是行转列。

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

最终输出结果 >>>

A       B       C       D       E  
------  ------  ------  ------  --------
     1      10      11      20        21
     2       9      12      19        22
     3       8      13      18        23
     4       7      14      17        24
     5       6      15      16        25
包括如下功能:  点是否在直线上。  假定点在直线上,点到直线起点的有向距离。如果点在直线上,点到直线距离为n。如果n>=0,则点在射线上;如果(n>=0)&&(n <= 线段长度) ,则点在线段上。  两直线是否平行或重合。  两直线是否重合。  两直线是否垂直。  两直线交点。  两非平行直线距离。  求垂足。 通过过平面一点和方向(单位矢量)表示平面。包括如下功能:  点到平面的有向距离。通过平面标准法向量和距离,可以求垂足;通过点到平面的距离的正负,可以看出多个点是否在同侧;如果点到平面的距离为0,则点在平面上,否则不在平面上。  直线是否在平面上  平面和直线的交点 通过调用其他功能可以实现的功能:  平面的法向量平行于直线,则平面和直线垂直  平面的法向量垂直于直线,则平面和直线平行  平面的法向量平行(垂直)则平面平行(垂直)  平行平面的距离等于平面任意一点到另一平面的距离 包括以下功能:  初始化为单位矩阵。  为向x,y,z方向缩放建立矩阵。  为任意方向缩放建立矩阵。投影平面,可以通过向平面法线方向缩放0实现。平面镜像,可以通过向平面法线方向缩放-1实现。  为对一个点镜像建立矩阵。  为对一条直线镜像建立矩阵。  为对一条对称轴旋转建立矩阵。  求对应行列式的值。  求逆矩阵。  求转置矩阵。  左乘。  求对应行列式的代数余子式。  常见运算符。 4.2 SN 封装了许多基础的功能。  读写锁。 二 避免依赖其它类库 有些类经常用于库间接口,所以需要避免依赖其它类库。  字符串类、函数,比如:宽字符、多字符间的转换。  时间类。  数组的封装。  将错误信息记录到全局变量中,应用场景:构造函数和析构函数中throw会引起不可预料的问题。  安全缓存,额外开辟若干个字节的空间,并初始化为一个特定值,如果不越界,这些值不会改变。  智能指针,为了将关联降为依赖。CAutoPtr<C> m_pC代替C m_c,头文件中不需要引用C类的头文件。只需要声明C类,在源文件中引用C类的头文件。  MD5。  RSA。  SHA。  考虑溢出的加减法。比如:int型的10亿加20亿,-10亿减20亿。  通过表名、列名、某些列的值生成sql语句。  安全指针和防野指针类。防野指针类:在构造函数中将状态初始为已初始化,在析构函数中将状态设置为已释放。安全指针在使用时之前判断 防野指针类释放是“已初始化”,否则抛出异常。  将有参数的函数统一成没参数返回值类型void的仿函数。  遍历文件夹的文件和子文件夹。  随机数和排列组合。  系列化和反系列化。将对象和变量转化成二进制,并将二进制转回变量和对象。  拆分,如字符串。 4.3 SNMFC 一 网络功能  网络基本功能:如获取本机IP,通过域名获取IP,IE版本。  HTML对话框的封装类。  用于服务端的,带“回调类”的绑定监听类,利用IO完成端口。  用于客户端的,带“回调类”连接类,利用select模式完成,可以指定是否开启新线程。连接时,可以指定超时时间,默认5秒。如果直接调用系统的connect,超时时间是75秒。  能够自动处理“粘包”、“拆包”的二进制解析类。  安全套接字的辅助类,如:设置发送、连接超时。  比较服务端的某个文件夹和客户端的某个文件夹,并更新那些md5不同的文件。 二 多线程  用临界区实现的线程锁,和线程读写锁。  窗口辅助类。  开启一个线程并调用一个函数。  开启一个线程并循环调用一个函数。  支持多线程的日志。  启动一个线程,等待若干秒后,Post或Send一个消息后,结束线程。  态树控件。  列表框扩展类和函数。  树控件的扩展。  组合框的扩展。  关于窗口功能的封装。比如:从左到右依次排列子窗口,排不下则下一行。可以指定行间距。页眉和页脚是行间距的一半。  位图的加载和显示。  Ini文件。  数组封装类。  获取硬件信息,如网卡。  文件或文件夹的常用功能。  注册表的扩展。 4.4 SNSTL  数组(向量)扩展。  用于多线程的向量。  JSON解析。  集合的扩展。  映射的扩展。  指针向量,可以存派生类。  指针映射,可以存派生类。 4.5 其它库  UnitTest,本机单元测试项目,对整个库的重要功能进行单元测试。  SNBCG,著名界面库的扩展,几乎没使用。  SNPicture,图形图像的处理(如转换bmp格式),几乎没使用。  SNMath,数学及数据结构库,几乎没使用。 1 使用数学函数RAND()生成3个10以内的随机整数。 RAND()函数生成的随机数在0~1之间,要生成0~10之间的随机数,RAND()需要乘以10,如果要求是整数,则还必须舍去结果的小数部分,在这里使用ROUND()函数,执行过程如下: mysql> SELECT ROUND(RAND()... 很久没怀疑过自己的智商了,直到遇见这 3 道题。你也来试试!这 3 道巨难的题目,来自 itpub 的 SQL 数据库编程大赛。说起 itpub 就不得不说它与 Oracle 的渊源,多少大师都在这里诞生。想成为 SQL 大师,有个最快的方法,就是刷题。如果能刷遍这里的题,Oracle 工作,十拿九稳。当年支付宝首席数据库架构师冯大-冯春培,就是典范。好了,闲话不说,上题!1,5X5方格棋盘难题在... 我们在上一篇文章中介绍了怎么用 SQL 打印 5 x 5 的矩阵,今天的内容仍旧围绕这个主题,只不过规则稍有点不同。先来看看要实现的效果。和前面一篇文章中的表格不同之处在于:偶数行的排序不再是从左到右是递增的,而是递减,或者说是从右到左递增。完整的规则:有一张 5 x 5 的表格,我们要往这张表格中填充 1~25 的数字;如果是奇数行,则从左到右填充数字;如果是偶数行,就需要按从右到左的顺序填入数... 要在MySQL生成一定范围的数字,可以使用存储过程。首先,我们需要创建一个表。之后,我们将创建一个存储过程,该过程将生成一个从10到1的数字范围。以下是创建表的查询-mysql>createtableGeneratingNumbersDemo−>(−>Numberint−>);现在,您可以创建一个存储过程,在表中存储一系列数字。以下是创建存储过程的查询-my... while(@i<=23) begin set @sql =isnull(@sql+' union select ','select ')+cast(@i As nvarchar); set @i=@i+1; exec(@sql) --方法2 SELECT number FROM MASTER 二、导入数据库样例 导入外部的.sql文件:这里指的是《MySQL必知必会》这本书中的样例,首先下载下来两个文件,放在E盘的根目录下,名字如下: 然后在mysql的命令行中,选择一个自己建的数据表或者选定已有的: CREATE DATABASE midi; USE mid... 这里有一种方法可以实现基于集的无循环。这也可以成为一个可重用的视图。这个例子显示了从0到999之间的序列的生成,但是当然,它可能会被修改以适应。INSERTINTOmyTable(nr)SELECTSEQ.SeqValueFROM(SELECT(HUNDREDS.SeqValue+TENS.SeqValue+ONES.SeqValue)SeqValueFROM(SELE... 排名函数是SQL SERVER2005新增的函数。排名函数总共有四种,分别是:row_number、rank、 dense_rank 、ntile。row_number:顺序生成序号。rank:相同的序值序号相同,但序号会跳号。dense_rank :相同的序值序号相同,序号顺序递增。ntile:装桶,把记录分成指的桶数,编序号。下面分别介绍一下这四个排名函数的功能及用法。