原题是邀月的大作《一个类似于杨辉三角的数组算法思路》,我觉得原文中所谓的“类似于杨辉三角”这个算法比较模糊,所以改成“俯瞰金字塔”,这样显得更形象一点。

 1 1 1 1 1 1 1 1 1 1 11 2 2 2 2 2 2 2 2 2 11 2 3 3 3 3 3 3 3 2 11 2 3 4 4 4 4 4 3 2 11 2 3 4 5 5 5 4 3 2 11 2 3 4 5 6 5 4 3 2 11 2 3 4 5 5 5 4 3 2 11 2 3 4 4 4 4 4 3 2 11 2 3 3 3 3 3 3 3 2 11 2 2 2 2 2 2 2 2 2 11 1 1 1 1 1 1 1 1 1 1

如果将数字看成是高度的话,中间高,四周低是一个很形象的金字塔哈。

废话少说,上SQL:

Oracle,SQL Plus中执行:

var v_level number;
exec :v_level := 10;  /* <- n在这里修改 */
with seq as (select level v from  dual connect  by level<= :v_level+1
),
matrix as (select r.v r,c.v c from seq r,seq c
),
m01 as (
select r,c,least(abs(case when r<=ceil(:v_level/2) then r else :v_level+1+1-r end),abs(case when c<=ceil(:v_level/2) then c else :v_level+1+1-c end)) v
from matrix order by r,c
)
select SYS_CONNECT_BY_PATH( v, ' ') matrix
from m01
where level=:v_level+1
start with c=1
connect by prior r=r and prior c=c-1
order by r ;
MATRIX
-------------------------1 1 1 1 1 1 1 1 1 1 11 2 2 2 2 2 2 2 2 2 11 2 3 3 3 3 3 3 3 2 11 2 3 4 4 4 4 4 3 2 11 2 3 4 5 5 5 4 3 2 11 2 3 4 5 6 5 4 3 2 11 2 3 4 5 5 5 4 3 2 11 2 3 4 4 4 4 4 3 2 11 2 3 3 3 3 3 3 3 2 11 2 2 2 2 2 2 2 2 2 11 1 1 1 1 1 1 1 1 1 1

解析一下,其实思路很简单,很暴力,设定 n=10 吧,

select level v from dual connect by level<= 10+1

产生一个 1~11的序列;

select r.v r,c.v c from seq r,seq c

全连接,产生一个 11*11的矩阵(r,c),r和c的取值范围在 1~11 之间

selectr,c,least(abs(case when r<=ceil(10/2) then r else 10+1+1-r end),abs(case when c<=ceil(10/2) then c else 10+1+1-c end)) v
from matrix order by r,c

有点算法的味道吧,对于某一点(r,c)的数值 v 有以下等式:

v = least(abs(case when r<=ceil(10/2) then r else 10+1+1-r end),abs(case when c<=ceil(10/2) then c else 10+1+1-c end))

least 是求最小值的函数。

SQL Server(需要SQL Server 2005或以上):

declare @level int;
set @level=10;  -- n在这里修改
with seq as (select v from ( selectrow_number() over (order by object_id) vfrom sys.objects)awhere v<=@level+1
),
matrix as (
select r.v r,c.v c, ( select MIN(v) from ( select case when r.v<=ceiling(@level/2) then r.v else @level+1+1-r.v end as v union all select case when c.v<=ceiling(@level/2) then c.v else @level+1+1-c.v end as v )a) as v
from seq r,seq c
),
cte as (select 0 as lvl,r,c,cast(v as varchar(100)) as line from matrix where c=1union all select lvl+1,m.r ,m.c , cast(c.line+' '+cast(m.v as varchar) as varchar(100)) as line from cte c,matrix m where c.r=m.r and m.c=c.c+1
)
select line as matrix from cte
where lvl=@level
order by r;
MATRIX
-------------------------
1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 3 3 2 1
1 2 3 4 4 4 4 4 3 2 1
1 2 3 4 5 5 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 5 5 4 3 2 1
1 2 3 4 4 4 4 4 3 2 1
1 2 3 3 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1

[原]SQL解决“俯瞰金字塔”矩阵相关推荐

  1. 利用Matlab 解决二维矩阵问题

    写在前面 Matlab是一款非常强大的数学计算工具,学习并使用它进行处理一些数据运算,将会非常之高效. 今天有同学问我了一道关于利用Matlab 解决二维矩阵问题,利用空闲时间给他解答,希望能帮助到他 ...

  2. SQL 解决in的参数烦恼(经典,简洁,高效)

    原SQL是不能执行的: select * from 表A where 字段A in (select 逗号分隔的字段B from 表B where 条件) 解决方案: select b.*  from  ...

  3. SQL反模式笔记17——用一条sql解决复杂问题

    目标:检查sql查询次数 反模式:试图用一条sql解决复杂问题 结果是:性能很低,而且往往得到了一个笛卡尔积. 解决方案:分而治之 用多个sql得到数据,再进行整合.或者union多个sql的结果. ...

  4. 创建存储过程时出现的This function has none of DETERMINISTIC, NO SQL解决办法

    This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...

  5. This function has none of DETERMINISTIC, NO SQL解决办法

    This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...

  6. 高手过招:用SQL解决环环相扣的刑侦推理问题(苏旭辉版本)

    苏旭晖,网名 newkid,ITPUB 开发版资深版主,SQL开发专家 本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题  之后,苏旭辉的一个版本,希望大家能够在高手的过招中,看到喜 ...

  7. 高手过招:用SQL解决环环相扣的刑侦推理问题(罗海雄版本)

    关注我们获得更多精彩内容! 本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题  之后(点击阅读原文查看历史信息),罗海雄老师提供了一个带注释的版本,希望初学者也能够直接看懂,不仅仅是 ...

  8. SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数)

    SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数) 内容目录 SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数) 一.要解决的问题 二.如何解决 ...

  9. SQL解决去重问题(在线超10min中的人数等)

    SQL解决去重问题(在线超10min中的人数等) 内容目录 SQL解决去重问题(在线超10min中的人数等) 一.描述 二.求解 1.思路1 2.思路2 三.牛客的SQL33:直播各科出勤率 一.描述 ...

最新文章

  1. 微服务领域,为什么选SpringCloud而不是Dubbo?
  2. python代码统计字符串中大写字符、小写字符、特殊字符以及数值字符出现的次数
  3. 疫情可以来,但比赛不能断
  4. mysql基础(DQL语言、DML语言、DDL语言)详解
  5. 关于box-shadow、border-radius不兼容ie8的解决办法
  6. bzoj15523506 robotic sort
  7. http 二进制_图解 HTTP 的前世今生!
  8. 0基础学单片机要知道51单片机CPU的一些相关构成以及作用
  9. Python代码:用户登录注册
  10. 史上最全的Java从入门到精通,播放最多的Java视频教程
  11. java求航班飞行时间代码,基于JAVA的航班动态接口调用代码实例
  12. wincc嵌入式excel报表 该报表系统能够读取WINCC中历史归档数据,产生出EXCEL报表文件,同时在画面中EXCEL控件实时显示
  13. 天津大学网页设计与制作答案合集
  14. /NOENTRY在VS里面的设置位置
  15. 【寻找最佳小程序】02期:腾讯旅游首款小工具“旅行小账本”——创意及研发过程大起底...
  16. linux pvs命令安装,Linux中的ldd命令和pvs命令
  17. 用C语言实现base64解密(包括二进制文件)
  18. 高德地图获取用户当前位置
  19. 北斗导航 | 北斗/GNSS相关数据下载:IGS/IGMAS/MGEX/DCB/brdc/gamit/bernese/rinex等
  20. systools ssd data recovery怎么用呢

热门文章

  1. DDM实践:数据库秒级平滑扩容方案
  2. centos 安装php5.6
  3. 中兴交换机查看光纤板支持的类型
  4. linux-swappiness参数的作用及设置
  5. LoadRunner学习笔记(一)
  6. 让我们带着感恩的心生活
  7. topcoder srm 330 div1
  8. Linux多线程实践(一)线程基本概念和理论
  9. Google Python Class --- Sorting
  10. Selenium Web 自动化 - Selenium常用API