🌿挑战100天不停更,刷爆 hive sql🧲
文章目录
- 🌿挑战100天不停更,刷爆 hive sql🧲
- NUM: 第31天 -查找比前一天温度高的所有日期的ID
- 🧨那就不废话了, 开始今天的刷题~~🧨
- 🎈表结构
- 🎉建表并插入数据
- 👓问题:查找比前一天温度高的所有日期的ID
- 直接看sql吧
- 🧨SQL
- 关于sql的规范问题
NUM: 第31天 -查找比前一天温度高的所有日期的ID
查找前一天的数据一般都需要用到开窗函数
lag()
,取窗口的前一天数据,对开窗函数lag()
不清楚的可以参考之前写过的sql,还有些取值相关的
这里再详细说一下关于lag()函数的传参问题lag(col,n,DEFAULT)
:用于统计窗口内往上第n行值
默认的DEFAULT
的为null
, 但是我们对于日期,默认的日期最好是写9999-99-99
官方conf
LAG
The number of rows to lag can optionally be specified. If the number of rows to lag is not specified, the lag is one row.
翻译成中文:lag
的中文意思是 落后 滞后的意思,上面的意思是说
- 可以选择指定滞后的行数。如果未指定要滞后的行数,则滞后为一行。(默认为
1
,如果我们在代码中需要找上一行的数据就可以不写) - 当前行的滞后在窗口开始之前延伸时,返回
null
。
实际的工作场景中,
lag()
只是进行了行的偏移,要理解偏移的概念,我们在sql
中就可以对行的偏移来进行数据对比
🧨那就不废话了, 开始今天的刷题~~🧨
🎈表结构
🎉建表并插入数据
CREATE TABLE t32
(
id string,
recode_date string,
Temperature string
);
INSERT INTO t32 (id, recode_date, Temperature)
VALUES ('1', '2015-01-01', '10'),
('2', '2015-01-02', '25'),
('3', '2015-01-03', '20'),
('4', '2015-01-04', '30');
👓问题:查找比前一天温度高的所有日期的ID
直接看sql吧
🧨SQL
SELECT Id
FROM (
SELECT Id,
recode_date,
Temperature,
lag(recode_date, 1, '9999-99-99') OVER (ORDER BY recode_date) yd,
lag(Temperature, 1, '999') OVER (ORDER BY recode_date ) yt
FROM t32
) tmp
WHERE Temperature > yt
AND datediff(recode_date, yd) = 1
关于sql的规范问题
- 尽量把逗号放在前面,为什么?
- 方便排查,不会遗漏逗号
- 方便注释,可以单行直接注释,不用再改逗号
- 排版看起来更紧密,我用datagrip快捷键ctrl + alt+ L可以快速缩进
- 特别用datagrip进行快速复制一行的时候,只需要Ctrl + D不需要关注逗号,写起来很快
- 使用关键字大写,养成好习惯
- 参考 hive sql 官方conf地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual