解锁SQL无限可能 | 利用SQL实现13位条码检测算法

2024-09-04 10:04

本文主要是介绍解锁SQL无限可能 | 利用SQL实现13位条码检测算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

0  需求分析

1 数据准备

2 问题分析

3 小结

数字化建设通关指南专栏原价99,现在活动价39.9,按照阶梯式增长,直到恢复原价


0  需求分析

算法:给定一个n位的数字字符串,取出这个条码字符串的前n-1位数字,用公式计算,看结果是都等于n位。

公式如下:

(1)将每个奇数位的数字相加得到S1

(2)将每个偶数位的数字相加得到S2

(3)用S1减去S2,将结果对10取模,然后计算绝对值。计算条码检查和的公式为

 abs(mod(s1-s2),10)

假设给定13位条码 :'2837232811227',按照上述规则进行验证。

1 数据准备

with check_sum as ( select '2837232811227' str )

2 问题分析

利用算法原理进行简单推导,看看具体是如何工作的

check_sum('283723281122')

=abs(mod((2+3++2+2+1+2) - (8+7+3+8+1+2),10))

=abs(mod(

(2-8+3-7+2-3+2-8+1-1+2-2),10

))

=abs(mod(

-17,10

))

=abs(-7) =7

第一步:先将字符串展开

with check_sum as (select '2837232811227' str)select pos + 1 id, val
from check_sumlateral view posexplode(split(str, '')) tmp as pos, val
where val <> ''

 

第二步:计算前12行,奇数行与偶数行差值的累计值。即S1-S2

with check_sum as (select '2837232811227' str)
select id, casewhen id <= max_id - 1then sum(case when mod(id, 2) = 0 then -val else val end) over (order by id) end s1_s2from (select pos + 1 id, val, max(pos + 1) over () max_idfrom check_sumlateral view posexplode(split(str, '')) tmp as pos, valwhere val <> '') t;

 

第三步:计算  abs(mod(s1-s2),10)

with check_sum as (select '2837232811227' str)
select id, casewhen id = max_id - 1 then abs(mod(s1_s2, 10)) end mod_s1_s2
from (select id, max_id, val, casewhen id <= max_id - 1then sum(case when mod(id, 2) = 0 then -val else val end) over (order by id) end s1_s2from (select pos + 1              id, val, max(pos + 1) over () max_idfrom check_sumlateral view posexplode(split(str, '')) tmp as pos, valwhere val <> '') t) t

3 小结

本文利用SQL分析了一种13位条码检测算法。关于此类利用SQL处理算法的问题很多,具体请参考我的“数字化建设通关指南”中的SQL进阶技巧,我把这些规律技巧进行了总结。

数字化建设通关指南
专栏原价99,现在活动价39.9,按照阶梯式增长,直到恢复原价

主要内容:


(1)SQL进阶实战技巧
可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程_sql语句写的很烂怎么办-CSDN博客

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得
       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

这篇关于解锁SQL无限可能 | 利用SQL实现13位条码检测算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135708

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删