首页 > 其他分享 >判断连续性

判断连续性

时间:2023-07-03 23:16:08浏览次数:39  
标签:连续性 判断 end cnblogs test 日期 连续 date

一、场景

1.1 问题

如下表、拿到数据的一部分,其中一月份缺少4日、9日、15日。

问题:如何知道连续n日的都有成交量的日期,用SQL语句写出来。

例子:n=3,1月1日就是目标日期,1月2日就不是目标日期。

 

 

 

1.2 环境

系统:win11

数据库:SQL Server2021 

二、解题思路

2.1 循环判定

这是想到的第一个思路,这种思路主要是受Python的影响。

比如,n=3 我要判定1月1日是否是目标日期,我可以对1月1日至1月3日的日期都进行判定,如果都是True,则返回True,否则返回False。

可这是SQL ,所有的变量都要声明,循环写起来能够吐血。

可以成功,但绝非良策。

 

2.2 开窗函数

参考:https://www.cnblogs.com/qianslup/p/15113955.html

 

/*
如果n=3
保证每个日期,仅有一行数据,如果有两行或者两个以上的记录,则要先清洗数据。
按照日期顺排,取当前行后面n-1=2行的日期,再将两个日期比较,如果日期相差=2,则为目标日期,如果大于2增,不是目标日期
*/
SELECT A.日期,A.交易量,[2行后的日期],CASE WHEN  DATEDIFF(day,日期,[2行后的日期])=2 THEN '连续3天成交日期' else '未连续3天成交日期' end AS 判定 FROM
(
SELECT *,MAX(日期) over (order by 日期 rows between current row and 2 following)  as '2行后的日期'  FROM test.cnblogs.连续   
) AS A
order by 日期

 

-- 也可以使用关联的方法
select A.日期,A.交易量,B.日期  as [2行后的日期],CASE WHEN  DATEDIFF(day,A.日期,B.日期)=2 THEN '连续3天成交日期' else '未连续3天成交日期' end AS 判定  from 
( SELECT *,ROW_NUMBER() over (order by 日期) AS 顺序 FROM test.cnblogs.连续 ) as A
LEFT JOIN ( SELECT *,ROW_NUMBER() over (order by 日期)  as 顺序 FROM test.cnblogs.连续 ) as B
ON A.顺序=B.顺序-2
ORDER BY a.日期

 

 

2.3 补充日期后开窗

/*
将缺失的日期补充进去,
保证从最小日期到最大日期,有且仅有一条数据。

*/


declare @start_date date;
declare @end_date date;
set @start_date =(select min(日期) from  test.cnblogs.连续 )
set @end_date =(select max(日期) from  test.cnblogs.连续 )
while (@start_date <  @end_date)
begin
    while @start_date not in (select 日期 from test.cnblogs.连续)
    begin
        insert into test.cnblogs.连续 values(@start_date, 0)
    end
    set @start_date =DATEADD(day,1,@start_date)
end


SELECT *,case when 连续天数=3 THEN '连续3天成交日期' else '未连续3天成交日期'  end AS 判定 FROM
(
SELECT *,SUM(CASE WHEN 交易量>=1 then 1 else 0 end ) over (order by 日期 rows between current row and 2 following)  as 连续天数
from test.cnblogs.连续
) AS A

 

 

 

 

2.4 使用开窗函数的rang

失败了,思路是根据当前行的日期,到连续3天的日期,count(*)两个日期之间有多少条满足要求的数据。

比如1月1日,连续3天,就是1月3日,如果1月1日-1月3日之间有3条满足要求的记录,则为目标日期。

欢迎大佬指导。

 

标签:连续性,判断,end,cnblogs,test,日期,连续,date
From: https://www.cnblogs.com/qianslup/p/17524396.html

相关文章

  • 38.如何用代码判断大小端存储?
    38.如何用代码判断大小端存储?大端存储:字数据的高字节存储在低地址中小端存储:字数据的低字节存储在低地址中例如:32bit的数字0x12345678所以在Socket编程中,往往需要将操作系统所用的小端存储的IP地址转换为大端存储,这样才能进行网络传输小端模式中的存储方式为:大端模式中的存......
  • Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
    有个需要是需要在安装包安装初始化时安装MicrosoftVisualc++2013Redistributable也就是判断软件安装前需不需要运行vcredist_x64.exe和VC_redist.x64.exe这两个程序第一反应就是可以通过注册表判断是否已经安装过环境但测试发现需求的两个版本不同,注册表位置竟然也不......
  • SQL Server中的NULL值处理:判断与解决方案
    摘要:在SQLServer数据库中,NULL是表示缺少数据或未知值的特殊标记。处理NULL值是SQL开发人员经常遇到的问题之一。本文将介绍SQLServer中判断和处理NULL值的不同方法,以及一些解决方案,帮助您更好地处理数据库中的NULL值情况。文章内容:引言:在数据库开发中,经常会遇到处理......
  • C++ 判断
    C++判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的一般形式: 判断语句C++编程语言提供了以下类型的判断语句。点击链接查看每个语句的细节。语句描述......
  • IOS开发-iOS中电话号码和邮箱判断
    在iOS应用中我们经常会遇到一些个人信息的设置,需要判断用户输入的信息是否正确,电话号码和邮箱等是否符合要求,下面直接上代码:1,判断字符串是否是电话号码:-(BOOL)checkTelNumber:(NSString*)telNumber{NSString*pattern=@"^1+[3578]+\\d{9}";NSPredicate*pred=[N......
  • atx-agent学习(1)-怎么判断是否安装了atx-agent
    atx-agent是运行在手机上的一个代理程序,可以通过网络进行手机测试,项目地址:https://github.com/openatx/atx-agent通过阅读uiautomator2源码,搞明白了判断的过程,有如下心得:安装adbutils库,建立Device对象,下面的代码可以获取atx_agent可执行文件是否存在atx_agent......
  • element-ui 日期时间选择框picker-options如何禁用时间范围( 多个时间范围判断 )
    1.element-ui算是我们在开发中用到最多的pc端ui框架,今天公司正好有一个需要用到date-picker的日期插件2.需求是这样的:共有三个时间选择器,后一个时间选择器要结合前面一个时间的范围值,去做时间判断,禁用前面所选时间,保证不可有重复时间  结果是......
  • 如何快速判断是否在容器环境
    在渗透测试过程中,我们的起始攻击点可能在一台虚拟机里或是一个Docker环境里,甚至可能是在K8s集群环境的一个pod里,我们应该如何快速判断当前是否在容器环境中运行呢?当拿到shell权限,看到数字和字母随机生成的主机名大概率猜到在容器里了,查看进程,进程数很少,PID为1的进程为业务进程,这......
  • https://leetcode.cn/ 第9题 判断回文数
    #回文数121是;123不是#定义一个函数判断是否是回文数defget_Hui(num):#将整数num转字符串str_num=str(num)str_num_change=str_num[::-1]num2=int(str_num_change)#判断整数num和num2是否相等if(num2==num):print("是......
  • 610. 判断三角形
    610.判断三角形SQL架构表: Triangle+-------------+------+|ColumnName|Type|+-------------+------+|x|int||y|int||z|int|+-------------+------+(x,y,z)是该表的主键列。该表的每一行包含三个线段的长度......