专栏首页数据和云高手过招:用SQL解决环环相扣的刑侦推理问题(苏旭辉版本)

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

苏旭晖,网名 newkid,ITPUB 开发版资深版主,SQL开发专家

本文是继 杨长老 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题 之后,苏旭辉的一个版本,希望大家能够在高手的过招中,看到喜爱、坚持、执着与技艺。

试题再次如图:

第一个解法如下:

with q as (select 'A' c FROM DUAL UNION ALL SELECT 'B' FROM DUAL UNION ALL SELECT 'C' FROM DUAL UNION ALL SELECT 'D' FROM DUAL) ,q2 as ( SELECT q1.c||q2.c||q3.c||q4.c||q5.c||q6.c||q7.c||q8.c||q9.c||q10.c s ,q7.c c7 ,q10.c c10 FROM q q1,q q2,q q3,q q4,q q5,q q6,q q7,q q8,q q9,q q10 WHERE q2.c||q5.c IN ('AC','BD','CA','DB') AND q3.c = CASE WHEN q3.c NOT IN (q6.c,q2.c,q4.c) THEN 'A' WHEN q6.c NOT IN (q3.c,q2.c,q4.c) THEN 'B' WHEN q2.c NOT IN (q3.c,q6.c,q4.c) THEN 'C' WHEN q4.c NOT IN (q3.c,q6.c,q2.c) THEN 'D' END AND q4.c=CASE WHEN q1.c=q5.c THEN 'A' WHEN q2.c=q7.c THEN 'B' WHEN q1.c=q9.c THEN 'C' WHEN q6.c=q10.c THEN 'D' END AND q5.c=DECODE(q5.c,q8.c,'A',q4.c,'B',q9.c,'C',q7.c,'D') AND q6.c=DECODE(q8.c||q8.c,q2.c||q4.c,'A',q1.c||q6.c,'B',q3.c||q10.c,'C',q5.c||q9.c,'D') AND ABS(DECODE(q8.c,'A',ASCII(q7.c) ,'B',ASCII(q5.c) ,'C',ASCII(q2.c) ,'D',ASCII(q10.c) )-ASCII(q1.c))<>1 AND DECODE(q1.c,q6.c,1,-1) =- DECODE(DECODE(q9.c,'A',q6.c,'B',q10.c,'C',q2.c,'D',q9.c),q5.c,1,-1) ) ,q3 AS (SELECT q2.*,REGEXP_COUNT(s,'A') ca,REGEXP_COUNT(s,'B') cb,REGEXP_COUNT(s,'C') cc,REGEXP_COUNT(s,'D') cd FROM q2) SELECT s FROM q3 WHERE c7=DECODE(LEAST(ca,cb,cc,cd),cc,'A',cb,'B',ca,'C',cd,'D') AND c10=DECODE(GREATEST(ca,cb,cc,cd)-LEAST(ca,cb,cc,cd),3,'A',2,'B',4,'C',1,'D') ; S ---------- BCACACDABA

如果用1234取代ABCD,最后再变回来,那么中间有些逻辑判断可以用算术,代码就更简单

with q as (select LEVEL c FROM DUAL CONNECT BY LEVEL<=4) ,q2 as ( SELECT q1.c||q2.c||q3.c||q4.c||q5.c||q6.c||q7.c||q8.c||q9.c||q10.c s ,q7.c c7 ,q10.c c10 FROM q q1,q q2,q q3,q q4,q q5,q q6,q q7,q q8,q q9,q q10 WHERE q2.c||q5.c IN ('13','24','31','42') AND q3.c = CASE WHEN q3.c NOT IN (q6.c,q2.c,q4.c) THEN 1 WHEN q6.c NOT IN (q3.c,q2.c,q4.c) THEN 2 WHEN q2.c NOT IN (q3.c,q6.c,q4.c) THEN 3 WHEN q4.c NOT IN (q3.c,q6.c,q2.c) THEN 4 END AND DECODE(q4.c,1,q1.c-q5.c,2,q2.c-q7.c,3,q1.c-q9.c,4,q6.c-q10.c)=0 AND q5.c=DECODE(q5.c,q8.c,1,q4.c,2,q9.c,3,q7.c,4) AND q6.c=DECODE(q8.c||q8.c,q2.c||q4.c,1,q1.c||q6.c,2,q3.c||q10.c,3,q5.c||q9.c,4) AND ABS(DECODE(q8.c,1,q7.c,2,q5.c,3,q2.c,4,q10.c)-q1.c)<>1 AND DECODE(q1.c,q6.c,1,-1) =- DECODE(DECODE(q9.c,1,q6.c,2,q10.c,3,q2.c,4,q9.c),q5.c,1,-1) ) ,q3 AS (SELECT q2.*,REGEXP_COUNT(s,'1') ca,REGEXP_COUNT(s,'2') cb,REGEXP_COUNT(s,'3') cc,REGEXP_COUNT(s,'4') cd FROM q2) SELECT TRANSLATE(s,'1234','ABCD') FROM q3 WHERE c7=DECODE(LEAST(ca,cb,cc,cd),cc,1,cb,2,ca,3,cd,4) AND c10=DECODE(GREATEST(ca,cb,cc,cd)-LEAST(ca,cb,cc,cd),3,1,2,2,4,3,1,4) ; TRANSLATE(S,'1234','ABCD') ------------------------------------- BCACACDABA

SQL 的世界,精彩一如既往。

本文分享自微信公众号 - 数据和云(OraNews)

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

原始发表时间:2018-06-20

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 缓存世界中的三大问题及解决方案

    Redis 经常用于系统中的缓存,可以极大地提高了系统性能和效率,但同时也带来一些问题。一个是数据一致性问题。从严格意义上讲,只要使用缓存,就会出现一致性问题,...

    数据和云
  • 深入剖析 Group Replication内核的引擎特性

    小编寄语 主库master与从库slave的切换不管是主动的还是被动的都需要外部干预才能进行,这与数据库内核本身是按照单机来设计的理念悉悉相关,并且数据库系统本...

    数据和云
  • 运维经验:回滚段异常的特殊救急方法

    ? 冷菠 冷菠,资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队管理以及培训经验。擅长数据库备份恢复、数据库性能诊断优化以及数据...

    数据和云
  • java IO体系

    IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里...

    GavinZhou
  • javaSE之如何将一个文件复制到另一个文件

    1 /* 2 * (1). 文件字符输入,输出流 3 * 文件字节输入,输出流的read和write方法使用 4 * 字...

    Gxjun
  • 一万小时天才的相对论

    长大后,你想成为什么样的人? http://mooc.guokr.com/talk/1438/ Emilie Wapnick: Why some of us ...

    杨熹
  • [Java IO]02_字节流

    概要 字节流有两个核心抽象类:InputStream 和 OutputStream。所有的字节流类都继承自这两个抽象类。 InputStream 负责输入,Ou...

    静默虚空
  • 腾讯企业邮发送邮件 java版

    背景: 由于spark streaming程序需要保证 1*24 小时,不间断运行的,为了第一时间知道程序是否出错,所以采用了出错发送邮件这一策略,而公司恰...

    shengjk1
  • Java 字节流

    此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器

    用户7625070
  • C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。

    Enjoy233

扫码关注云+社区

领取腾讯云代金券