傅昌林:百万级数据挑战的大师,NineData编程大赛的卓越表现

news2025/1/9 1:24:54

数据库编程大赛:一条SQL计算扑克牌24点

图片

参赛选手:傅昌林

个人简介:HBI Solutions, Inc, VP Engineering

参赛数据库:SQL Server

性能评测:百万级数据代码性能评测 11.45秒

综合得分:78.8

以下是傅昌林选手的代码说明思路简介:

1. 数据范围估计

2. 由于只有715种数字组合且每种组合至多需要一种解答, 算法的主要思想是构建出这个结果集, 对于每条查询数据在这个结果集里寻找匹配

3. 随后按照具体的12条步骤生成最终结果。

以下是傅昌林选手的算法说明,结尾附完整SQL:


算法说明:

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

参赛完整SQL:

;WITH Nums AS (    SELECT CAST(value as INT) as val, value as str    FROM STRING_SPLIT('1,2,3,4,5,6,7,8,9,10', ',')), Ops AS (    SELECT value as str    FROM STRING_SPLIT('+,-,*,/', ',')), ExprN2 AS (    SELECT        u.str + op.str + v.str AS str,        CASE            WHEN op.str = '+' THEN u.val + v.val            WHEN op.str = '-' THEN u.val - v.val            WHEN op.str = '*' THEN u.val * v.val            WHEN op.str = '/' THEN u.val / v.val        END AS val,        u.val AS n1,        v.val AS n2,        op.str AS op1    FROM Nums u    LEFT JOIN Nums v ON 1 = 1    LEFT JOIN Ops op ON 1 = 1    WHERE (op.str = '/' AND v.val <> 0 AND u.val % v.val = 0) OR (op.str != '/')), ExprN3 AS (  SELECT        IIF(op.str IN ('*', '/') AND u.op1 IN ('+', '-'), '(' + u.str + ')' + op.str + v.str, u.str + op.str + v.str) AS str,        CASE            WHEN op.str = '+' THEN u.val + v.val            WHEN op.str = '-' THEN u.val - v.val            WHEN op.str = '*' THEN u.val * v.val            WHEN op.str = '/' THEN u.val / v.val        END AS val,        u.n1,    u.n2,        v.val AS n3,    u.op1,        op.str AS op2    FROM ExprN2 u    LEFT JOIN Nums v ON 1 = 1    LEFT JOIN Ops op ON 1 = 1    WHERE (op.str = '/' AND v.val <> 0 AND u.val % v.val = 0) OR (op.str != '/')), ExprN4 AS (  SELECT        IIF(op.str IN ('*', '/') AND u.op2 IN ('+', '-'), '(' + u.str + ')' + op.str + v.str, u.str + op.str + v.str) AS str,        CASE            WHEN op.str = '+' THEN u.val + v.val            WHEN op.str = '-' THEN u.val - v.val            WHEN op.str = '*' THEN u.val * v.val            WHEN op.str = '/' THEN u.val / v.val        END AS val,        u.n1,    u.n2,    u.n3,        v.val AS n4    FROM ExprN3 u    LEFT JOIN Nums v ON 1 = 1    LEFT JOIN Ops op ON 1 = 1    WHERE (op.str = '/' AND v.val <> 0 AND u.val % v.val = 0) OR (op.str != '/')), ExprN2N2 AS (    SELECT    '(' + u.str + ')' + op.str + '(' + v.str + ')' AS str,        CASE            WHEN op.str = '+' THEN u.val + v.val            WHEN op.str = '-' THEN u.val - v.val            WHEN op.str = '*' THEN u.val * v.val            WHEN op.str = '/' THEN IIF(v.val = 0, 0, u.val / v.val)        END AS val,        u.n1,    u.n2,        v.n1 AS n3,        v.n2 AS n4    FROM ExprN2 u    LEFT JOIN ExprN2 v ON 1 = 1    LEFT JOIN Ops op ON 1 = 1    WHERE (op.str = '/' AND IIF(v.val = 0, -1, u.val % v.val) = 0) OR (op.str != '/')), ExprSpecial AS (  -- Case 1: a * (b/c + d) = ab/c + ad  SELECT    a.str + '*(' + b.str + '/' + c.str + '+' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE a.val * b.val % c.val = 0 AND a.val * b.val / c.val + a.val * d.val = 24  -- Case 2: a * (b/c - d) = ab/c - ad  UNION  SELECT    a.str + '*(' + b.str + '/' + c.str + '+' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE a.val * b.val % c.val = 0 AND a.val * b.val / c.val - a.val * d.val = 24  -- Case 3: a * (b - c/d) = ab - ac/d  UNION  SELECT    a.str + '*(' + b.str + '-' + c.str + '/' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE a.val * c.val % d.val = 0 AND a.val *  b.val - a.val * c.val / d.val = 24  -- Case 4: a / (b/c + d) = ac / (b + cd)  UNION  SELECT    a.str + '/(' + b.str + '/' + c.str + '+' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE (b.val + c.val * d.val) <> 0 AND a.val * c.val % (b.val + c.val * d.val) = 0 AND a.val *  c.val / (b.val + c.val * d.val) = 24  -- Case 5: a / (b/c - d) = ac / (b - cd)  UNION  SELECT    a.str + '/(' + b.str + '/' + c.str + '-' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE (b.val - c.val * d.val) <> 0 AND a.val * c.val % (b.val - c.val * d.val) = 0 AND a.val *  c.val / (b.val - c.val * d.val) = 24  -- Case 6: a / (b - c/d) = ad / (bd - c)  UNION  SELECT    a.str + '/(' + b.str + '-' + c.str + '/' + d.str + ')' AS str,    24 AS val,    a.val AS n1,    b.val AS n2,    c.val AS n3,    d.val AS n4  FROM Nums a  LEFT JOIN Nums b ON 1 = 1  LEFT JOIN Nums c ON 1 = 1  LEFT JOIN Nums d ON 1 = 1  WHERE (b.val * d.val - c.val) <> 0 AND a.val * d.val % (b.val * d.val - c.val) = 0 AND a.val *  d.val / (b.val * d.val - c.val) = 24), ExprMerged AS (  SELECT *  FROM ExprN4  WHERE val = 24  UNION  SELECT *  FROM ExprN2N2  WHERE val = 24  UNION  SELECT *  FROM ExprSpecial), ExprWithTag AS (  SELECT S.str AS result, STRING_AGG(num, ',') WITHIN GROUP (ORDER BY num) as tag  FROM (SELECT str, col, num FROM ExprMerged UNPIVOT (num for col IN (n1, n2, n3, n4)) unpvt) S  GROUP BY S.str ), ResultWithRk AS (  SELECT tag, result, ROW_NUMBER() OVER(PARTITION BY tag ORDER BY result) as rk  FROM ExprWithTag), ResultLookup AS (  SELECT tag, result  FROM ResultWithRk  WHERE Rk = 1)SELECT Src.id, Src.c1, Src.c2, Src.c3, Src.c4, Ans.resultFROM poker24.cards SrcJOIN (  SELECT S.id, STRING_AGG(num, ',') WITHIN GROUP (ORDER BY num) as tag  FROM (SELECT id, col, num FROM poker24.cards UNPIVOT (num for col IN (c1, c2, c3, c4)) unpvt) S  GROUP BY S.id ) IdTag  ON Src.id = IdTag.idLEFT JOIN ResultLookup Ans  ON IdTag.tag = Ans.tagORDER BY Src.id

数据库编程大赛,下一次再聚!

感谢大家对本次《数据库编程大赛》的关注和支持,欢迎加入技术交流群,更多精彩活动不断,我们下次再相聚!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1373757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang学习-指针

1、定义 指针也是一个变量&#xff0c;但它是一个特殊的变量&#xff0c;它存储的是另一个变量的内存地址。是引用数据类型。 取一个变量的地址&#xff1a;&a 定义&#xff1a; var p *int &a 可以理解为 指针变量p中存储的是a的内存地址&#xff0c;但是变量p也…

vue实现-年、月、日、时、分、秒、星期?

一、文章引导 #mermaid-svg-nP4oT3Y4d6oaxUsg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-icon{fill:#552222;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-text{fill:#552222;stroke:#55222…

安卓应用无法拉起部分机型微信支付

错误提示&#xff1a; 2024-01-11 09:01:01.878 11754-11754 MicroMsg.S...ApiImplV10 com.bm.read E register app failed for wechat app signature check failed 2024-01-11 09:01:01.879 11754-11754 MicroMsg.S...ApiImplV10 com.bm.read E s…

蔚来出手,空气悬架「悬」了

空气悬架的这把火&#xff0c;可能要被「浇灭」了。 目前&#xff0c;在乘用车赛道&#xff0c;主动悬架按照控制类型&#xff0c;主要可以分为液压悬架、空气悬架和电磁感应悬架。其中&#xff0c;空气悬架因为中国本土造车新势力的强力推动&#xff0c;在过去几年时间成为市场…

C++11教程:C++11新特性大汇总(第六部分)

C11是2011年发布的C标准&#xff0c;是C的一次重大升级。 第十二部分&#xff1a;C多文件编程 十一、C11列表初始化&#xff08;统一了初始化方式&#xff09; 我们知道&#xff0c;在 C98/03 中的对象初始化方法有很多种&#xff0c;请看下面的代码&#xff1a; //初始化列…

SpringBoot+SSM项目实战 苍穹外卖(10) Spring Task WebSocket

继续上一节的内容&#xff0c;本节学习Spring Task和WebSocket&#xff0c;并完成订单状态定时处理、来单提醒和客户催单功能。 目录 Spring Task&#xff08;cron表达式&#xff09;入门案例 订单状态定时处理WebSocket入门案例 来单提醒客户催单 Spring Task&#xff08;cron…

⭐Unity 将电脑打开的窗口画面显示在程序中

1.效果&#xff1a; 下载资源包地址&#xff1a; Unity中获取桌面窗口 2.下载uWindowCapturev1.1.2.unitypackage 放入Unity工程 3.打开Single Window场景&#xff0c;将组件UwcWindowTexture的PartialWindowTitle进行修改&#xff0c;我以腾讯会议为例 感谢大家的观看&#xf…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

vue 登陆禁止弹出保存密码框及禁止默认填充密码

οnfοcus“this.removeAttribute(‘readonly’);” readonly 初始化为只读&#xff0c;当聚焦时去掉只读属性&#xff0c;只读可以防止浏览器自动填充。 -webkit-text-security&#xff1a;指定要使用的形状来代替文字的显示 none 无。 circle 圆圈。 disc 圆形。 square 正方…

【Python学习】Python学习12-字典

目录 【Python学习】Python学习12-字典 前言创建语法访问列表中的值修改与新增字典删除字典元素Python字典内置函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的字典&#xff0c;是可变的容器&#xff0c;每个字典由键值对组成用冒号隔开&#xff0c;…

ArcMap实现多行标注

地图标注是地图的重要组成部分&#xff0c;也是地理信息的重要表达方式​。ArcMap的符号化系统为我们添加地图标注提供了方便&#xff0c;但是有时我们却需要添加多行标注&#xff0c;今天我们一起来探索一下ArcMap中两行标注的实现方式​。 首先&#xff0c;我们右击目标图层…

云流量回溯的工作原理及关键功能

云计算和网络技术的快速发展为企业提供了更灵活、高效的业务运营环境&#xff0c;同时也引发了一系列网络安全挑战。在这个背景下&#xff0c;云流量回溯成为网络安全领域的一个关键技术&#xff0c;为企业提供了对网络活动的深入洞察和实时响应的能力。 一、 云流量回溯的基本…

微信小程序中路由跳转的方式有哪些?区别?

面试官&#xff1a;说说微信小程序中路由跳转的方式有哪些&#xff1f;区别&#xff1f; 一、是什么 微信小程序拥有web网页和Application共同的特征&#xff0c;我们的页面都不是孤立存在的&#xff0c;而是通过和其他页面进行交互&#xff0c;来共同完成系统的功能 在微信小…

创意天堂:25个聚焦艺术、设计和创意的网站推荐

1、即时设计 说到即时设计&#xff0c;每个人都应该熟悉它。不久前&#xff0c;即时设计开启了世界上第一个可以使用人工智能完成UI设计草案的即时设计「即时AI」大规模的内部测试也给产品设计行业带来了新的发展方向。事实上&#xff0c;对于产品设计师来说&#xff0c;即时设…

自动化测试框架pytest系列之21个命令行参数介绍(二)

第一篇 &#xff1a; 自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 接上文 3.pytest功能介绍 3.1 第一条测试用例 首先 &#xff0c;你需要编写一个登录函数&#xff0c;主要是作为被测功能&#xff0c;同时编写一个测试脚本 &#xff0c;进行测试登录功能 。 登…

ROS建图之ROS标准REP-105(官方搬运翻译+个人理解)

REP-105 是一个由 Wim Meeussen 于 2010年10月27日 创建并维护的&#xff0c;名为 "Coordinate Frames for Mobile Platforms"&#xff08;移动平台的坐标系框架&#xff09;的 ROS Enhancement Proposal&#xff08;REP&#xff09;。ROS官方教程&#xff1a;REP 10…

C盘删除的文件怎么恢复?恢复文件,4个方法!

“请问一下在c盘中删除的文件还有机会恢复吗&#xff1f;保存了一些比较重要的工作文件&#xff0c;但是在清理电脑时误删了&#xff0c;怎么恢复呢&#xff1f;” C盘作为系统盘&#xff0c;保存了很多重要的文件。有时候电脑会默认将某些文件自动保存在c盘。那么&#xff0c;…

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;视频监控中心录像服务器 二、存储策略服务 &#xff08;一&#xff09;存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…

迅为RK3568开发板Android11/12/Linux编译驱动到内核

在平时的驱动开发中&#xff0c;经常需要在内核中配置某种功能&#xff0c;为了方便大家开发和学习&#xff0c;本小 节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。 Android11 源码如果想要修改内核&#xff0c;可以运行以下命令进行修改: cd ke…