- lag(field, num, defaultvalue),其中fied是要查询的字段,num是向前取几行,defaultvalue是取不到值时的默认值 。向上面案例中那样,假设按照userid分组后又按照pay_time排序了,第一个查出来的用户刚好也有多条不同pay_time的数据,那么查询结果应该是第一行数据为last_pay_time为NULL,pay_time为该用户的最小的时间,第二行数据的last_pay_time等于第一行数据的pay_time值,而pay_time为第二小的时间 。
- lead(field, num, defaultvalue),其中fied是要查询的字段,num是向后取几行,defaultvalue是取不到值时的默认值 。向上面案例中那样,假设按照userid分组后又按照pay_time排序了,第一个查出来的用户刚好也有多条不同pay_time的数据,那么查询结果应该是第一行数据为next_pay_time为第二行的pay_time,pay_time为该用户的最小的时间,第二行数据的next_pay_time等于第三行数据的pay_time值,而pay_time为第二小的时间,而该用户的最后一行的next_pay_time则为NULL 。
-- 将用户年龄按照18岁及以下,18岁至65岁,65岁以上分类selectcase when age<=18 then '未成年' when age>18 and age <=65 then '青中年' else '老年' end as age_group,name,age,sexfrom user
case when 语法其实就是java语言的if...else if ...else if...else,当满足条件时就进入该分支,不满足的话就一直进入下面的分支,最后所有条件都不满足则进入else分支,通常在Sql中我们使用case when then进行一些归纳分类,譬如我们的电商涉及到的商品种类众多,可能需要按照某些规则进行分类,就免不了使用该语法 。1.5union,union all
select namefrom Aunionselect name from Bselect name from Aunion allselect name from B
- 想去重使用union,不去重完全放一起使用union all
- 假设A表中某列有重复数据,然后A表和B表进行union,A表中的那列数据自动的去重,不仅仅是把B表中的那列和A表重复的数据去重 。像案例中的union后的结果一样,所得的name不会有一条重复数据,相当于整体的distinct了一下 。
- union 和 union all查询数据结果只以第一句sql的字段名称为准,后续的sql只按照顺序匹配,不会识别字段名称
-- 创建hive分区表create table db_demo.tb_demo (filed1 string comment '字段1', filed2 int comment '字段2')PARTITIONED BY(l_date string) ;-- 删除表分区altertable db_demo.tb_demo drop if exists partition(l_date = '${v_date}')--将数据写入表分区insert into table db_demo.tb_demo partition(l_date = '${v_date}')select * from db_demo.tb_demo_v0 where ......--覆盖指定分区表数据insert overwrite table db_demo.tb_demo partition(l_date = '${v_date}')select * from db_demo.tb_demo_v0 where ......
- 分区表指的是在创建表时指定的partition的分区空间 。
- 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下 。
- 分区字段会作为表的最后一个字段出现 。
-- 取出JSON串中指定key的value值-- 语法get_json_object('{key1:value1,key2:value2}','$.key')--比如取出JSON串中的name信息select get_json_object('{"age":1089,"name":"tom"}','$.name')
1.8日期函数-- to_date:日期时间转日期select to_date(create_time) from demo_db.demo_table;-- current_date :当前日期select current_date-- date_sub : 返回日期前n天的日期selectdate_sub(pay_time,9) from demo_db.demo_table-- date_add : 返回日期后n天的日期,即使放入时间参数,得到的也是日期,上一个同理,只比较日期位 。selectdate_add(pay_time,9) from demo_db.demo_table-- unix_timestamp:获取当前unix时间戳select unix_timestamp('2022-10-10 10:22:11')-- datediff:返回开始日期减去结束日期的天数,只比较日期位select datediff('2022-10-10 23:22:11','2022-10-09 00:22:11')-- 获取当前月select substr(current_date,1,7);--获取上个月最后一天select DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAY(FROM_UNIXTIME(UNIX_TIMESTAMP())))
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- JAVA的File对象
- 华为开发者大会HDC2022:HMS Core 持续创新,与开发者共创美好数智生活
- Java 超新星开源项目 Solon v1.10.10 发布
- 将java装进u盘指南
- Java函数式编程:三、流与函数式编程
- 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动
- 2022,一个Java程序猿的外设配置
- 2022,一个Java程序猿的装机配置
- Java 多线程写zip文件遇到的错误 write beyond end of stream!
- 1 JAVA语言学习-面向对象