首页 > 数据库 >sql求连续值问题

sql求连续值问题

时间:2024-05-20 09:12:35浏览次数:27  
标签:tday price sql 问题 连续 tflag rn over SELECT

一. 找出表test1中tflag字段连续出现3次及以上为1的行

1.png
思路:1. 对行进行编号,2. 对相邻三行进行求和算出值作为sumflag,3. 如果值为3,则该行以及接下来的2行都输出出来,通过自关联解决。

WITH tmp AS (
  SELECT tday, tflag, 
         row_number() over(partition by null order by tday) as rn, -- 对表进行排序,并编rownumber
         sum(tflag) over (partition by null order by tday rows between current row and 2 following) sumflag -- 对字段tflag往下2行求和
    FROM test1) 
SELECT tday, tflag 
  FROM tmp a 
 WHERE EXISTS (SELECT 1 FROM tmp b WHERE a.rn >= b.rn AND a.rn <= b.rn + 2 AND b.sumflag = 3); -- 对表进行关联取值

2.png

二. 找出表test2中price字段连续上涨3次及以上的行。

3.png
思路:这题较上一题有点难度,连续上涨3次,也就是至少输出4行。需要用到错位函数,相邻行相减。

  1. 对行进行编号,2. 对相邻行相减,3. 对减法的flag进行求和,4. 自关联
WITH tmp1 AS (
  SELECT tday, price, 
         row_number() over(partition by null order by tday) as rn, -- 对表进行排序,并编rownumber
         case when (price - lag(price) over(partition by null order by tday) >0) then 1 else 0 end as tflag -- 对上一行相减 
    FROM test2),
     tmp2 AS (  
  SELECT rn 
    FROM (SELECT rn, 
                 sum(tflag) over (partition by null order by tday rows between current row and 2 following) sumflag 
            FROM tmp1) x 
   WHERE sumflag = 3) -- 过滤出连续3次上涨的第1次上涨的行 
SELECT tday, price FROM tmp1 
 WHERE EXISTS (SELECT 1 FROM tmp2 WHERE tmp1.rn >= tmp2.rn - 1 AND tmp1.rn <= tmp2.rn + 2); -- 需要找出前1行和后2行组成连续的4行

4.png

附件:

CREATE TABLE test1 (
  tday varchar(10),
  tflag int 
);

INSERT INTO test1 VALUES ('1201',0),('1202',1),('1203',0),('1205',0),('1208',1),('1209',1),('1210',1),('1213',1),('1215',0),('1216',0),('1219',1),('1220',1),('1222',0),('1223',1),('1224',1),('1225',1),('1226',0),('1227',0),('1228',1),('1229',1),('1230',0),('1231',1);

CREATE TABLE test2 (
  tday varchar(10),
  price int
);

INSERT INTO test2 VALUES ('1201',10),('1203',20),('1204',17),('1205',15),('1207',23),('1208',26),('1209',29),('1210',11),('1211',9),('1213',5),('1214',7),('1215',15),('1217',15),('1218',13),('1219',11),('1220',9),('1221',10),('1223',30),('1224',40),('1225',50),('1227',21),('1228',40),('1229',30),('1230',11);

我一边听着凤凰传奇的动次打次,一边去想sql,这歌真提神!

标签:tday,price,sql,问题,连续,tflag,rn,over,SELECT
From: https://www.cnblogs.com/ddzj01/p/18201154

相关文章

  • SQL优化-20231016
    数据结构数据库的表和索引缺一不可表特点:无序,插入速度快,查找速度慢索引(B+Tree)特点:有序,插入速度慢,查找速度快查找的效率比较,如果按照读取的数据块来计算?测试数据TABLE_OWNERTABLE_NAMEINDEX_NAMECOLUMNS......
  • Mysql - 数据库时区是客户端属性还是服务端属性
    一、说明同事问我数据库的时区是客户端属性还是服务端属性,我觉得这个问题十分有意思,之前没怎么留意,自己来做下实验。首先介绍几个术语。GMT(GreenwichMeanTime),格林尼治平均时间。UTC(CoordinatedUniversalTime),协调世界时。CST(ChinaStandardTime),中国标准时间,也称北京时间......
  • go高并发之路——go语言如何解决并发问题
    一、选择GO的原因作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但21年之后的新项目基本......
  • Redis 缓存常见问题处理
    缓存穿透缓存穿透是指客户端的请求数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些请求都会到达数据库,从而导致数据库负载过高。常见解决方案有两种:缓存空对象:实现简单、方便维护,是解决缓存穿透的首选方法,但会造成额外内存消耗,或短期的数据不一致布隆过滤:内存占用少,没......
  • 配置SQLServer远程连接
    要在SQLServer上启用远程连接,需要执行以下步骤:1、确保SQLServer已启用远程连接:登录到SQLServer所在的计算机上。打开SQLServerManagementStudio(SSMS)。使用Windows身份验证或SQLServer身份验证登录SQLServer。在左侧的对象资源管理器中,右键单击服务......
  • 小白总结uniapp微信小程序跨域问题的解决(前端)
    小白总结uniapp微信小程序跨域问题的解决(前端):https://blog.csdn.net/m0_69848498/article/details/137628381?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%AD%98%E5%9C%A8%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98%E5%90%97&utm_medium=......
  • SQL Server 2012提供了多种备份和还原数据库的方法,包括以下几种:
    SQLServer2012提供了多种备份和还原数据库的方法,包括以下几种:SQLServerManagementStudio(SSMS):SSMS是一个支持图形用户界面的工具,可以通过它备份和还原整个数据库或特定的数据表、视图等。在SSMS中,可以通过右键单击数据库并选择“任务”>“备份”或“还原”来完成操作......
  • P8764 [蓝桥杯 2021 国 BC] 二进制问题
    P8764[蓝桥杯2021国BC]二进制问题一、问题简析本题采用数位dp求解。令\(f[i][j]=\)在\(i\)位二进制中,有\(j\)个\(1\),共有几个数。(相当于求组合数)由于数据范围为\(1\leN\le10^{18}\),最大二进制位数设置为70,防止溢出。预处理组合数for(inti=0;i<MAX;+......
  • Linux安装MySQL配置教程
    1.使用系统的root账户2.切换到 /use/local目录下3.下载mysql wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz   也可以直接在官方下载最新版本 官方下载 选择linux4.解压mysql tarxvJfmysql-8.0.21-li......
  • redis存储之序列化问题
    1.问题描述:在SpringBoot集成Redis过程中,添加进redisf的内容如下2.出现这种情况的原因(1) 键和值都是通过Spring提供的Serializer序列化到数据库的(2) RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer3.解......