OrderDate DATE NOT NULL, ProductName VARCHAR(100) NOT NULL, SequenceID INT IDENTITY(1,1));-- 订单日期增加当前日期默认值约束...('2023-04-08', '智能手机Y7'), -- 商品B的第二次购买,较早日期 ('2023-04-20', '平板电脑Z3'), -- 商品C的第二次购买,较晚日期 ('2023...使用ROW_NUMBER()函数删除重复项ROW_NUMBER()函数是SQL Server中处理重复数据的强大工具之一,可以通过窗口函数来为每一组重复数据分配行号,然后保留每组数据中最新的一条记录。...ROW_NUMBER():为每组内的记录分配一个行号,最新的记录行号为1。删除重复记录:在CTE中删除RowNum大于1的记录,即除了每个分组最新的一条记录外,其余视为重复并删除。...具体步骤如下:创建临时表:首先,创建一个临时表,结构与原表相同,用于存储去重后的数据。使用MERGE语句:通过MERGE语句将原表数据与临时表数据进行比较,保留每个唯一标识下的最新记录。
非空值函数LastnonBlank第2参数使用方法 LastnonBlank(,) 参数 描述 column 列名或者具有单列的表,单列表的逻辑判断 expression...如果我们第二参数只写一个常数,则等同于返回列表的最大值,主要差异表现在汇总合计上。 有2张表,一张是余额表,另外一张是日历表,并做关系链接。 ? ? 我们来看下3种写法,返回的不同结果。...解释:带常数的LastnonBlank度量值,不会显示汇总,因为只返回日期列里的最大值。因为LastnonBlank是根据ACISS大小来返回最后一个,也就是返回ACISS的最大值。...第1个度量,既然知道第2参数是常数,也就是返回最大值,日历筛选的时候,因为汇总的时候是没有指定值的,所以返回为空白。 第2个度量,是在日历表上进行筛选后进行返回最后日期,所以返回的也不带有汇总。...第3个度量因为返回的是相关表,也就是原表的日期,所以返回的时候也就有了汇总一栏。 如果觉得有帮助,那麻烦您进行转发,让更多的人能够提高自身的工作效率。
二、SQL函数: 用于执行特殊的操作的函数; 1、分类: 单行、 分组、分析; 2、单行函数分类: 从表中查询的每一行只返回一个值; 字符、数字、日期、转换、其他; 3、字符函数:...,'CLERK','职员','SALESMAN','导购') as 工作 from emp 4、数字函数; 5、日期函数: 对日期值进行计算,并生成日期数据类型或数值类型的结果; add_months...sbirth) from java0322;--计算年纪 6、转换函数: to_char:按照指定的格式转化字符串; to_date:将字符串转化为日期; to_number:将数字字符串转化为数字;...,为空时指定0; nvl2:不为空时指定值2,为空时指定值3; NullIF:相等时为空,否则为前者 --查询员工表的所有人的姓名,工资+奖金(奖金没有的时候,由null转为0)---nvl转换空值的函数...、sum、count 8、分析函数: 根据一组行来计算聚合值;用于计算完成聚集的累计排名、移动平均数等; row_number:返回连续的排位,不论值是否相等; rank:具有相等值的行排位相同
代码如下图左侧所示,我们使用了.str将原字段视为字符串,从ts中截取了前10位,从orderid中截取了前8位。经验表明有时在.str之前需要加上astype,能够避免不必要的麻烦。...-”为空,在pandas中可以使用字符串的replace方法,hive中可以使用regexp_replace函数。...四、窗口函数 row_number hive中的row_number函数通常用来分组计数,每组内的序号从1开始增加,且没有重复值。比如我们对每个uid的订单按照订单时间倒序排列,获取其排序的序号。...我们可以通过split函数将原来的字符串形式变为数组,然后依次取数组的元素即可,但是要注意使用substr函数处理好前后的中括号,代码如下: ?...可以看到,我们这里得到的依然是字符串类型,和pandas中的强制转换类似,hive SQL中也有类型转换的函数cast,使用它可以强制将字符串转为整数,使用方法如下面代码所示。 ?
各分组排序函数的差异 我们将 rank() dense_rank() row_number() 的结果都打印出来: SELECT *, rank() over (PARTITION BY city ORDER...dense_rank(): 值相同时排名相同,但不占用排名数字,整体排名更加紧凑。 row_number(): 无论值是否相同,都强制按照行号展示排名。...然而使用窗口函数的聚合却不会导致返回行数减少,那么这种聚合是怎么计算的呢?...),这就是 BI 工具一般说的 RUNNGIN_SUM 的实现思路,当然一般我们排序规则使用绝对不会重复的日期,所以不会遇到第一个红框中合并计算的问题。...与 GROUP BY 组合使用 窗口函数是可以与 GROUP BY 组合使用的,遵循的规则是,窗口范围对后面的查询结果生效,所以其实并不关心是否进行了 GROUP BY。
在这个例子中, order_date 字段可以被视为确定最新版本的依据。 要解决这个问题,一种常见的方法是使用窗口函数。...在 SQL 中,窗口函数可以在不影响结果集行数的情况下,为每一行数据计算出一个特定的值。...对于我们的需求,可以使用 ROW_NUMBER() 窗口函数为每一个 order_id 按照 order_date 降序排列并进行编号。...在这个结果集中,使用 ROW_NUMBER() 函数为每个 order_id 分组内的记录按照 order_date 降序排列并编号。... order_date ,然后将主查询中的表与这个子查询结果进行连接,条件是 order_id 相同且 order_date 为最大值,从而得到最新的记录。
窗口函数类别 专用窗口函数例如rank、row_number、lag和lead等,在窗口函数中有静态函数和动态函数的分类,具体的划分如下。 ?...1的等差数列; 第一步,先用row_number()函数排序,然后用登录日期减去排名,得到辅助列日期,如果辅助列日期是相同的话,证明用户是连续登录。...其实可以在以上的查询结果为基础,利用聚合函数就可以求出最大的登录天数问题。假如求解连续登录5天的用户,除了可以使用上述的方法,还可以使用lead函数进行窗口偏移来进行求解。...示例:数据还是上题中的数据,求解连续登录五天的用户 第一步,用lead函数进行窗口偏移,查找每个用户5天后的登陆日期是多少,如果是空值,说明他没有登录。运行的代码为 ?...第二步,用datediff函数计算 (日期-第五次登陆日期)+1是否等于5,等于5证明用户是连续5天登录的,为空值或者大于5都不是5天连续登陆的用户。
注意: 如果expression1的值非空,优先取expression1的值; 如果expression1的值空且expression2的值非空,则取expression2的值; 如果expression1...3、 row_number(order by field_name) 函数作用:将数据集按照某个字段排序,并产生序号字段 ?...4、 to_date(source_string, formater_string) 函数作用:将字符串转换为日期类型 ? 5、to_char() 函数作用:将其他类型转换为字符串类型 ?...6、wm_concat 函数作用:行转列,将多行查询结果聚合到一行的某一列中 ?...over(partition by field_name, order by field_name) 函数作用:over函数是一个分析函数,和聚合函数搭配在一起使用可以简洁代码 ?
2-3 T-SQL函数 学习系统函数、行集函数和Ranking函数;重点掌握字符串函数、日期时间函数和数学函数的使用参数以及使用技巧 重点掌握用户定义的标量函数以及自定义函数的执行方法 掌握用户定义的内嵌表值函数以及与用户定义的标量函数的主要区别...日期时间函数 日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。...图2-3 薪酬排序基本情况 图2-4 row_number函数排序 图2-5 row_number另一使用 我们可以使用Row_number函数来实现查询表中指定范围的记录,一般将其应用到Web应用程序的分页功能上...rank函数的使用方法与row_number函数完全相同。...在定义函数返回值时使用Returns定义返回值的类型,而在定义函数中将使用return最后返回一个值变量,因此在用户定义的函数中,return命令应当是最后一条执行的命令,其基本的语法结构见下所示: CREATE
NVL:给空字段赋值 2. 分组统计,查出各部门中男女的个数: 3. 行转列: 4. 列转行 5. 综合练习 6. 查询顾客的购买明细及月购买总额 7. 将每个顾客的cost按照日期进行累加 8....求前20%的订单数据 13. percent_rank():这条数据在这个数据中的百分之多少,一般也是配合有序窗口使用 14. rank():排序函数(排序相同时会重复,总数不会变) 15. dense_rank...()【排序相同时会重复,总数会减少】、row_number()【会根据顺序计算】 16. current_date() 返回当前时间 17. date_add(current_date(),100) 返回当前日期后...: 将每个顾客的cost按照日期进行累加: 求明细,以及每个月有哪些顾客来过: 查询每个顾客上次的购买时间: lag(col,n,default_val):某一列往前第n行数据,他一般配合有序窗口使用...):这条数据在这个数据中的百分之多少,一般也是配合有序窗口使用 rank():排序函数(排序相同时会重复,总数不会变) dense_rank()【排序相同时会重复,总数会减少】 、row_number
CONCAT函数,直接忽略其中的类型,忽略对NULL的检查,直接连接成一个非空的字符串: select p.PROJECT_ID,CONCAT( p.CODE,',',p.NAME,',',p.NICK_NAME...以前要把数字或者日期转换成字符串,可以使用CONVERT函数并带人第三个整数类型的参数指定转换的格式,不过这种方法太麻烦,整数参数不容易理解和记忆,而且也不灵活。...所以个人觉得这个函数的使用面非常 3.5各种日期时间函数。...除了一个EOMONTH函数是返回给定日期的最后一天外,其他的新函数,都是把年月日作为参数传进去,返回指定数据类型的对象,相当于就是CONVERT函数的变形。总体使用不多,在此不多介绍。...之前OVER子句是用于RANK,ROW_NUMBER等排名函数,现在OVER子句得到了大大的增强, 可以将OVER子句应用到聚合函数中,也增加了一些分析函数。
窗口函数将一组行中的一个(或多个)字段的值组合在一起,并在结果集中为生成的列中的每一行返回一个值。...如果未指定ROWS子句,则缺省值为从分区开始处(前面未绑定)到当前行。ROWS子句可以与first_value(Field)和sum(Field)窗口函数一起使用。...例如,ROW_NUMBER() OVER (ORDER BY City)首先将顺序整数分配给没有City值的行,然后将顺序整数分配给排序顺序中具有City值的行。...ROWS子句将NULL(没有赋值)的字段视为值为零。...支持的窗口函数 支持以下窗口函数: FIRST_VALUE(field)——将指定窗口中第一行(ROW_NUMBER()=1)的字段列的值赋给该窗口中的所有行。
SQL 8.0窗口函数 实现思路: 对用户ID和登录日期去重 对每个用户ID按照日期顺序进行编号 将登录日期减去编号对应的天数,使连续的日期转换为同一天 将连续日期转换为同一个日期之后就可以按照这个字段分组...,这里以第一个为准;如果需要获取全部的最大日期可以使用rank或dense_rank窗口函数,可以保证天数一致时排名一致。...) 前面方法使用的是SQL 8.0窗口函数,但在低版本sql5.0中并没有窗口函数,如果面试官提出不让用窗口函数,应该怎么办呢?...所以针对这取分组最大的问题还是使用rank函数效果更高一些。...RANK、DENSE_RANK差异 本题在一个用户存在多个最大连续日期时只要求取第一个,如果需要取每个用户所有的最大连续日期,则需要使用rank或dense_rank窗口函数。
(组内排序、取前百分之多少的值、时间函数) 从一个实习和秋招过来人的角度看,这些知识基本够面试的时候用了,如果本身也在数据分析岗位实习或者实习过,可以在评论区讨论或者补充一些也常常用到的SQL知识,大家一起交流进步...使用count distinct进行去重统计会将reducer数量强制限定为1,而影响效率,因此适合改写为子查询。 想分性别进行统计,看看男女各多少?...,例如计算最大值、最小值、平均值、总数、求和 只想查看A公司的男女人数数据?...row_number() 则在排序相同时不重复,会根据顺序排序。 想要获取top10%的值?...select datediff ('2016-12-30','2016-12-29'); -- 得到 "1" to_date函数可以把时间的字符串形式转化为时间类型,再进行后续的计算; 常用的日期提取函数包括
连续问题的万能模板 我在《拼多多面试题:如何找出连续出现N次的内容?》里讲过遇到“连续问题”如何解决,并送出了一个万能模板,模板使用的是窗口函数解决连续问题。...窗口函数 窗口函数lead使用方法: lead(字段名,N,默认值) over(partion by …order by …) 默认值是指:当向上N行或者向下N行值时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值...窗口函数lead可以获取每个字段的后面的第n个值,并生成新的一列。 而这道题描述的“用户连续登陆”中的“连续”可以理解为用户当前的登陆日期与本月下一次登陆日期相差一天。...子查询 用户每次连续登陆天数与用户登陆顺序存在某种必然的关系,此时我们可以先用子查询将用户在本月的阅读顺序查询出来,使用窗口函数row_number: select *, lead(日期...将这两种情况过滤出来之后,用户连续登陆天数为:当前登陆顺序减去上一个登陆顺序。
如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。...: coalesce 语法: coalesce(T v1, T v2, …) 返回值: T 说明: 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL hive> select coalesce...使用explode函数将hive表中的Map和Array字段数据进行拆分 lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合...分隔符将被加到被连接的字符串之间; COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。...()使用: ROW_NUMBER()从1开始,按照顺序,生成分组内记录的序列。
整体实现思路: 1.用户每天可能不止登陆一次,将登录日期去重,取出当日登陆成功的日期,row_number()函数分组排序并计数 2.日期减去计数得到值 3.根据每个用户count(值)判断连续登陆天数...4.最后取连续登陆天数大于等于7天的用户 示例: CREATE TABLE db_test.user_log_test( datestr string comment ‘日期’, uid string...2020-08-21’,‘3’,1); insert into db_test.user_log_test values(‘2020-08-20’,‘3’,1); 操作步骤: 1.计算出用户登陆成功的日期...db_test.user_log_test where status=1 ) a where rn=1 ; 2.日期减去计数得到值 select uid,date_sub(datestr...(n天就只需要把lead(date,6,-1)中的6改成n-1并且把date_sub(cast(b.date as date),6)中的6改成n-1)
数据已经按照用户日期去重,请查出连续登录超过4天的用户ID 2.考点 row_number() 函数 、datediff()函数 、日期格式处理 对于连续登录问题处理逻辑,对于同一个用户,如果连续登录...,row_number排序和 登录日期与月初的日期差是一个恒定值,如果存在非连续,则值不同。...详见下图 可以看到,连续时diff值相同,不连续时diff值就出现变化。这也就说明,只要统计diff值相同的行数,就能计算出每次连续登录的天数。...3.SQL step1:处理日期格式,计算登录日期与月初日期('2022-01-01')差date_diff select user_id, login_date, datediff...()开窗,计算每个用户每个登录日期的排序 row_num select user_id, login_date, datediff(from_unixtime(unix_timestamp
)表生成函数,一进多出 窗口函数 窗口函数(Window functions)是一种SQL函数,非常适合于数据分析,因此也叫做OLAP函数,其最 大特点是:输入值是从SELECT语句的结果集中的一行或多行的...) •空判断函数: isnull( a ) •非空判断函数: isnotnull ( a ) •空值转换函数: nvl(T value, T default_value) •非空查找函数: COALESCE...•assert_true: 如果’condition’不为真,则引发异常,否则返回null常见的分组排序函数 row_number:在每个分组中,为每行分配一个从1开始的唯一序列号,递增,不考虑重复;...explode函数的使用 在Select的时候,explode的旁边不支持其他字段的同时出现,Hive专门提供了语法lateral View侧视 图,专门用于搭配explode这样的UDTF函数 lateral...view侧视图 Lateral View是一种特殊的语法,主要用于搭配UDTF类型功能的函数一起使用,用于解决UDTF函数的 一些查询限制的问题。