sql之每天一个小函数之几个实用小函数

sql解决按月每天叠加,sql累加问题 sql解决按月每天叠加,sql累加问题 问题描述: 拿到手的表,需要统计每天 sersive科目下当月的总量,即累计server科目 当月每天的num和 data month sersive num 2022-01-03 202201 前日余额 272761.98 2022-01-04 202201 前日余额 272812.98 2022-01-05 202201 前日余额 272996.43 目标表: data month sersive num count 2022-01-04 阅读详情

今天讲
业务中常见的处理连续活跃同类型问题
这类问题常用的函数为lag窗口函数,datadiff日期函数等,今天就介绍这两类函数

lag与lead函数可以返回上下行的数据
语法:lead(col,n,default) 用于统计窗口内往下第n行值
第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

日期比较函数: datediff
语法: datediff(string enddate, string startdate)
返回值: int
说明: 返回结束日期减去开始日期的天数。

下面通过案例来演示

建表sql如下:
create table active AS
  SELECT 100 UID,
              '2021-04-01'dt
   UNION ALL SELECT 101 UID,
                        '2021-04-01'dt
   UNION ALL SELECT 102 UID,
                        '2021-04-01'dt
   UNION ALL SELECT 103 UID,
                        '2021-04-01'dt
   UNION ALL SELECT 100 UID,
                        '2021-04-02'dt
   UNION ALL SELECT 101 UID,
                        '2021-04-02'dt
   UNION ALL SELECT 102 UID,
                        '2021-04-02'dt
   UNION ALL SELECT 103 UID,
                        '2021-04-02'dt
   UNION ALL SELECT 104 UID,
                        '2021-04-02'dt
   UNION ALL SELECT 100 UID,
                        '2021-04-03'dt
   UNION ALL SELECT 104 UID,
                        '2021-04-03'dt
   UNION ALL SELECT 101 UID,
                        '2021-04-04'dt
   UNION ALL SELECT 102 UID,
                        '2021-04-04'dt
   UNION ALL SELECT 103 UID,
                        '2021-04-04'dt
   UNION ALL SELECT 104 UID,
                        '2021-04-04'dt
   UNION ALL SELECT 105 UID,
                        '2021-04-04'dt
   UNION ALL SELECT 102 UID,
                        '2021-04-03'dt

需求为:
(1) 某APP用户活跃记录表active,有uid(用户id)、dt(活跃日期)字段,求出连续出勤3天及以上的用户数

分析:
1.首先要找出每个员工对应的UID和该员工的工作时间, 筛选出用户的连续工作的日期
2.判断每个UID下的连续时间为三天的
这里就要用到lag开窗函数,需要保证员工该日期前两天有数据才证明有连续工作的情况,因此lag(col,n,default)中的字段应该为dt,n为2
代码如下:

第一步:
SELECT UID,
               dt,
               lag(dt,2)over(PARTITION BY UID ORDER BY dt)dt2
        FROM active

跑出的数据如下图
在这里插入图片描述

第二步

select
count(DISTINCT uid)
from(
        SELECT UID,
               dt,
               lag(dt,2)over(PARTITION BY UID ORDER BY dt)dt2
        FROM active
        )x
where datediff(dt,dt2)=2

最后的判断条件,datediff函数,结束日期为dt2,开始日期为dt(参照上图内层函数跑出的结果理解)
跑出的结果如下图
在这里插入图片描述

(2) 某APP用户活跃记录表active,有uid(用户id)、dt(活跃日期)字段,求每个用户的最大连续活跃天数

惯例分析:
1.求最大连续活跃天数,这里我们用lag或者lead函数就很简单了lag(dt,1),每个日期往前或者往后一天,判断日期前后的差值,为 1,则说明前后两天连续,否则不连续(切记不能直接从建好的表里找数据,这只是案例,如果又十万条数据呢?看表的目的只能是获取字段)

第一步与上题同理,略过了,直接第二步

select
        UID,dt,dt2,if(datediff(dt,dt2)=1,1,0)if_continue
        from(
                SELECT UID,
                       dt,
                       lag(dt,1)over(PARTITION BY UID ORDER BY dt)dt2
                FROM active
                )x

结果如下图
在这里插入图片描述这里注意最后一个新生字段if_continue 说明了 if 和datediff这两个函数结合之后的功能,判断是否连续(即差值为1),如果是,返回1,否则为0,有点像case when 的原理

第三步:

select
    UID,dt,max(if(if_continue=0,dt,null))over(PARTITION BY UID ORDER BY dt)start_dt
    from(
        select
        UID,dt,dt2,if(datediff(dt,dt2)=1,1,0)if_continue
        from(
                SELECT UID,
                       dt,
                       lag(dt,1)over(PARTITION BY UID ORDER BY dt)dt2
                FROM active
         )x
    )y

这里尤其要注意这个max的用法,日期的比较靠前的为大的,这里很多人应该不明白为什么,解释起来很麻烦,要考虑到同一个人有断开的现象,比如上图中的101号的就有这种情况,所以我们要拿到连续日期的最早的一天
结果如下
在这里插入图片描述第四步:

select  UID,max(datediff(dt,start_dt))days
from(
    select
    UID,dt,max(if(if_continue=0,dt,null))over(PARTITION BY UID ORDER BY dt)start_dt
    from(
        select
        UID,dt,dt2,if(datediff(dt,dt2)=1,1,0)if_continue
        from(
                SELECT UID,
                       dt,
                       lag(dt,1)over(PARTITION BY UID ORDER BY dt)dt2
                FROM active
         )x
    )y
)z
group by UID

结果为
在这里插入图片描述差不多就是这样了,筒子们zaiwei!

SQL DATEDIFF函数详解[源码] DATEDIFF 是 SQL 中用于计算两个日期之间天数差异的常用函数,适用于日期筛选和时间间隔计算。文章详细介绍了 DATEDIFF 的基本语法和参数说明,并通过实例展示了其使用方法。例如,计算两个具体日期的天数差,筛选即将到期的记录,以及计算会员资格剩余天数等实用场景。DATEDIFF 在数据分析、报告和日常数据库管理中具有广泛的应用价值。 立即下载

相关推荐

PCIe Electrical PHY(4)-PCIE SPEC第8章指标讲解

1.1 PCIE TX SPEC TX主要关心两类参数,一类是Voltage Parameters,一类是Jitter Parameters。 其中Voltage相关参数主要关心不同preset下差分电压幅度的准确性。以及共模电压的稳定性。 PCIE spec中对Jitter相关的参数测量定义如下: 分为两大类:DDJ(Data dependent Jitter)和UJ(Uncorrelated ...

maxwell2ic的博客 5949

SQL一些不熟悉函数总结

分组合并函数 GROUP_CANCAT([distinct] str [order by str asc/desc] [separator]) 将group by产生的同一个分组中的值连接起来,返回一个字符串结果 示例:查询每个部门的员工姓名 mysql> select deptno,group_concat(ename) -> from emp -> group by deptno; +--------+--------------------------------------+

Echoblabla的博客 396

SRAM compiler中Power Gating与Retention的实战配置指南

本文深入解析了在SRAM compiler中配置Power Gating(电源门控)与Retention(数据保持)功能的实战指南。针对低功耗芯片设计,文章详细阐述了如何根据应用场景(如移动AP、IoT设备)权衡开关类型、尺寸、唤醒时序以及保持电压,以实现静态功耗优化与数据可靠性的最佳平衡,并强调了后端实现与签核检查的关键要点。

weixin_29204121的博客 293

hiveSql冷门但好用函数 --持续更新

hiveSql冷门但好用函数 --持续更新

i_mycode的博客 4871

Polardb训练营-本地部署 PolarDB-X

PolarDB-X是阿里巴巴自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。云原生+MySQL生态PolarDB-X已作为标准云产品在世界范围内的13个地区提供服务。依托云资源和容器化部署能力,PolarDB-X可以在数分钟内完成集群创建和变配,整个过程中用...

yangjunfeng0604的博客 2472

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1201

Oracle冷门却又好用的函数、脚本

一、获取层级数据,查询拥有下属的所有leader数据 where 1= 1 connect by prior emp_id = lead_id; level 是伪列的使用,格式化层级 connect_by_isleaf 是否是叶子节点 connect_by_root 查找根节点 select lpad(' ',level*2,' ')||emp_name as name,emp_id,lead_id,salary,level from employee start w

记录工作生活中的学习笔记和心得体会 958

离线安装PlutoSDR硬件支持包全攻略:没有MathWorks账号也能搞定MATLAB集成

本文详细介绍了在没有MathWorks账号和网络环境的情况下,如何离线安装PlutoSDR硬件支持包并实现MATLAB集成的完整解决方案。从驱动安装、设备识别到MATLAB支持包的离线部署,提供了全面的步骤指导和常见问题排查方法,特别适合高校实验室、军工单位等内网环境使用。

js777的博客 265

【MySQL】冷门易忘易错函数和经典例题

【MySQL】易忘易错函数和经典例题

人类所有真实的快乐,一定是恒久的努力 849

深入探究ASP.NET Core读取Request.Body的正确方式

前言# 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中。因为笔者日常开发所使用的主要也是ASP.NET Core所以笔者也遇到这这种场景,关于本篇文章所套路的内容,来自于在开发过程中我遇到的关于Request.Body的读取问题。在之前的使用的时候,基本上都是借助搜索引擎搜索的答案,并没有太关注这个,发现自己理解的和正确的使用之间存在很大的误区。故有感而发,便写下此文,以作记录。学无止境

萌兔兔MMQ!! 776

反应堆设计:基于MATLAB的反应堆仿真和分析,包括反应堆稳态分析、反应堆动态分析和反应堆安全分析 介绍

反应堆设计是利用计算机技术对核反应堆进行设计和模拟,以获得安全、高效、经济的核能发电系统。它是核能领域的重要组成部分,在电力生产、核医学、科学研究等领域有着广泛的应用。

走向CTO的路上... 1112

SQL之每天一个小函数

Ntile函数使用 函数解释: 可以看成是:它把有序的数据集合平均分配到指定的数量(num)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。(这个算法在很多当中使用,spark中数据分片的时候也是这个算法,只不过是不均匀的时候,优先分配给较大编号的分片) 语法是:ntile (num) over ([partition_clause] order_by_clause) as your_bucket_num 然后可以根据桶号,选取前或后 n分之几

夜归人的博客 353

基于STM32、HAL库的 CH9102X USB转UART收发器 驱动程序设计

/ 或 UART_HWCONTROL_RTS_CTS。// 其他函数实现类似,使用HAL_UART_Transmit_IT, HAL_UART_Receive_IT等。UART_TXD <---> USARTx_RX (STM32接收)UART_RXD <---> USARTx_TX (STM32发送)* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。

corlin6688的博客 506

sql月度汇总_SQL语句统计每天、每月、每年的 数据

1、每年select year(ordertime) 年,sum(Total) 销售合计from 订单表group by year(ordertime)2、每月select year(ordertime) 年,month(ordertime) 月,sum(Total) 销售合计from 订单表group by year(ordertime),month(ordertime3、每日select ye...

weixin_42501704的博客 5425

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

sql月度汇总_【转】SQL语句统计每天、每月、每年的数据

原文:https://www.cnblogs.com/fooo/p/3435687.htmlsql语句统计每天、每月、每年的数据1、每年select year(ordertime) 年,sum(total) 销售合计from 订单表group by year(ordertime)2、每月select year(ordertime) 年,month(ordertime) 月,sum(total) 销...

weixin_31100713的博客 2326

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SQL Server 中几个有用的特殊函数

在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_executesql,checksum 遂记下,以备日后查询。不敢独享,与君共之。有用且看,无用略过。 1> isnumeric( expression ) -- 返回值 1 | 0,判断是否是数

qq_25627143的博客 619

MySQL的几个实用字符串函数 (转)

MySQL的几个实用字符串函数 (转) 收藏 最近老婆问我要一个在mysql里做行列转换的sql语句,想了半天没想出来,还是去网上搜一下吧,然后就发现了这篇文章,非常实用,特转过了一起分享:)<br /><br /> 原文地址:http://blog.54master.com/index.php/316158/viewspace-20836<br /><br />MySQL的几个实用字符串函数1、concat()函数<br />    1.1 MySQ

falizixun2的专栏 740

几个实用的mysql函数

在工作中,处理数据时候往往使用php要废很多脑筋和写很多东西,如果不考虑代码的阅读性试试几个mysql的函数可以解决许多常见需求: 1.截取字符串函数: left() 从左开始截取字符串 right() 从右substring(字段名,开始位置,截取长度)例子:select substring(username,1,2) as newname from user; substr...

acjw89738的博客 123

SQL中几个常用的排序函数

最近使用窗口函数的频率越来越高,这里打算简单介绍一下几个排序的函数,做一个引子希望以后这方面的问题能够更深入的理解,这里先简单介绍一下几个简单的排序函数及其相关子句,这里先从什么是排序开始吧。 排序函数是做什么的? 排序函数的作用是基于一个结果集返回一个排序值。排序值就是一个数字,这个数字是典型的以1开始且自增长为1的行值。由ranking函数决定排序值可以使唯一的对于当前结果集,或者...

放飞理想的pig小猪 6515

SQL的函数

sql函数的学习

weixin_51884452的博客 2852

MySQL统计近一个月每天的数量没有则显示为0

先上代码: SELECT lefttable.date,IFNULL(righttable.m,'0') as num FROM (SELECT date_sub(CURDATE(),interval @i:=@i+1 day) as date from (select 1 union all select 1 union all select 1 union all select 1 union all select 1 union all select 1 union all select 1

shenxiaomo1688的博客 5614

SQL自定义函数

自定义函数分为二种,一种是标量值函数,另一种是表格值函数 1 标量值函数 :返回一个标量值 语法: Create function 函数名(参数) Returns 返回值数据类型 as begin SQL语句(必须有return 变量或值) End 如示例: CREATE FUNCTION MySTR(@strs VARCHAR(50)) RETURNS VARCHAR(50) AS BEG...

小猪奋斗 1万+

SQL语句统计每天、每月、每年的数据

SQL语句统计每天、每月、每年的数据   1、每年 select year(ordertime) 年, sum(Total) 销售合计 from 订单表 group by year(ordertime) 2、每月 select year(ordertime) 年, month(ordertime) 月, sum(Total) 销售合计 ...

GuangRong1的博客 1496

非常实用的sql函数

总结一些工作中用到的比较实用的sql函数,持续更新中。。。 1、date_format(参数1,参数2) 格式化日期, 参数1类型:date(日期) 参数2类型:string(字符串),即日期格式 示例如下: // %Y %m %d %H %i %s,分别对应年月日时分秒 date_format(r.receive_date,'%Y-%m-%d %H:%i:%s') as receiveDate 2、concat(参数1,参数2…) 将多个字符串连接在一起 参数类型:全部都是st.

smileKutper的博客 310

SQL数据清洗实用函数——以具体场景为例详细学习

回顾整个数据清洗过程,SQL 提供了大量灵活高效的函数和语句,帮助我们标准化格式、清理缺失值、拆分与合并字段、去除重复数据等。类型转换CONVERT更新与替换ISNULLREPLACE字符串处理SUBSTRINGCHARINDEXPARSENAME条件逻辑判断CASE WHEN窗口函数与去重结构调整数据删除DELETE这些工具不仅可以提升数据清洗的效率,还能增强 SQL 脚本的可读性与可维护性。掌握它们,是每一位数据分析师、数据工程师乃至数据科学从业者必备的技能。小伙伴们赶紧动手学习起来吧!

Shimmmmmer1的博客 1533
上一篇: Java中的容器解析----集合.2
下一篇: JAVA中的容器解析----集合3---List集合的子类
是番茄鱼啊
博客等级 码龄6年 3粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值