LAG()函数是一个窗口函数,允许您从当前行向前看多行数据。与LEAD()函数类似,LEAD()函数对于计算同一结果集中当前行和后续行之间的差异非常有用。
成都创新互联公司IDC提供业务:BGP机房服务器托管,成都服务器租用,BGP机房服务器托管,重庆服务器租用等四川省内主机托管与主机租用业务;数据中心含:双线机房,BGP机房,电信机房,移动机房,联通机房。
LAG语法: LAG(列名,[offset], [default_value]) OVER ( PARTITION BY 列名,... ORDER BY 列名 [ASC|DESC],... )
LEAD语法: LEAD(列名,[offset], [default_value]) OVER ( PARTITION BY 列名,... ORDER BY 列名 [ASC|DESC],... )
offset:offset是从当前行偏移的行数,以获取值。offset必须是一个非负整数。如果offset为零,则LEAD()函数计算当前行的值。如果省略 offset,则LEAD()函数默认使用一个。
default_value:如果没有后续行,则LEAD()函数返回default_value。例如,如果offset是1,则最后一行的返回值为default_value。如果您未指定default_value,则函数返回 NULL 。
PARTITION BY子句:PARTITION BY子句将结果集中的行划分LEAD()为应用函数的分区。如果PARTITION BY未指定子句,则结果集中的所有行都将被视为单个分区。
ORDER BY子句:ORDER BY子句确定LEAD()应用函数之前分区中行的顺序。
用途举例:
ps:
不适合计算留存,举例说明:
求3日留存用户,以下为用户登录表login_history_table:
首先使用LEAD函数对用户登录时间做偏移,SQL如下:
结果如下:
根据上面查询到的结果,3日留存用户中不能统计到abc,而实际应该包含abc,因为该用户20211022登录后,在3天后的20211025日又重新登录了。
1、函数必须指定返回值,且参数默认为IN类型。
2、存储过程没返回值,参数可以是 IN,OUT,IN OUT类型,有的人可能会理解成OUT 也算是返回值。
3、调用方式:函数 select my_fun() ;过程 call my_pro( ) ;
4、DEMO
mysql的位函数,就是将数字转换成2进制,各位求与。举个例子2915 结果是13。29的二进制是11101,15的二进制是1111,位运算 11101+01111------------ 0110101101的十进制是13。在Oracle里面是BITAND(nExpression1, nExpression2) 参数 nExpression1, nExpression2 指定按位进行 AND 运算的两个数值。这个函数进行位运算,MySQL我没怎么用,希望有帮助
MySql计算两个日期的时间差函数TIMESTAMPDIFF用法:
语法:
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
说明:
返回日期或日期时间表达式datetime_expr1
和datetime_expr2the
之间的整数差。其结果的
单位由interval
参数给出。interval
的法定值同TIMESTAMPADD()函数说明中所列出的相同。
复制代码
代码如下:
SELECT
TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01');
interval可是:
SECOND
秒
SECONDS
MINUTE
分钟
MINUTES
HOUR
时间
HOURS
DAY
天
DAYS
MONTH
月
MONTHS
YEAR
年
YEARS
MySQL数据库中year()函数是求某个特定日期中的年份,代码如下:
select '2015-08-11' as date,year('2015-08-11') as year;
确定一个日期是一年中的第几个季度,可以用QUARTER()函数实现,代码如下:
SELECT '2015-08-11' AS DATE,QUARTER('2015-08-11') AS QUARTER;
返回一个日期是一年中的月份,利用month()函数实现,代码如下:
SELECT '2015-08-11' AS DATE,MONTH('2015-08-11') AS MONTH;
获取一个确定日期是一个月份中的多少号,可以用day()函数求得,具体实现代码如下:
SELECT '2015-08-11' AS DATE,DAY('2015-08-11') AS DAY;
有时日期中带有时间,而如何获取小时数,这可以利用自带的函数hour()实现,代码如下:
SELECT '2015-08-11 12:20:45' AS DATE,HOUR('2015-08-11 12:20:45') AS HOUR;
求取日期时间中的分钟数,可以利用MINUTE()函数实现,代码如下:
SELECT '2015-08-11 12:20:45' AS DATE,MINUTE('2015-08-11 12:20:45') AS MINUTE;
最后,获取时间中的秒数,利用SECOND()函数实现,代码如下:
SELECT '2015-08-11 12:20:45' AS DATE,SECOND('2015-08-11 12:20:45') AS SECOND;
执行顺序:
适用结构相同的表联结成一张大表
内连接:返回两个表共同的行
左连接:以表 1 为基础,匹配表 2 的相同行
右连接:以表 2 为基础,匹配表 1 的相同行
全连接:返回全部数据,可以理解为左连接和右连接的结合
mysql 没有全连接
常用于组内排序,具体写法如下
窗口函数可以用 rank 相关函数或者聚合函数
当前日期+时间(date + time)函数:now()
当前时间戳函数:current_timestamp()
日期或时间转换为字符串 函数:date_format(date,format), time_format(time,format)
lower(str):将字符串参数值转换为全小写字母后返回
upper(str):将字符串参数值转换为全大写字母后返回
concat(str1, str2,...):将多个字符串参数首尾相连后返回
concat_ws(separator,str1,str2,...):将多个字符串参数以给定的分隔符 separator 首尾相连后返回
substr(str,pos):截取从 pos 位置开始到最后的所有 str 字符串
substr(str, pos, len):截取 str 字符串,从 pos 位置开始的 len 个字符
length(str):返回字符串的存储长度
char_length(str):返回字符串中的字符个数
format(X,D,locale):以格式 ‘#,###,###.##’ 格式化数字 X,D 指定小数位数,locale 指定国家语言(默认的 locale 为 en_US)
left(str, len):返回最左边的len长度的子串
right(str, len):返回最右边的len长度的子串
ltrim(str),rtrim(str):去掉字符串的左边或右边的空格
repeat(str, count):将字符串 str 重复 count 次后返回
reverse(str):将字符串 str 反转后返回
通俗易懂的学会:SQL窗口函数
mysql format时间格式化说明
MySQL常用字符串函数