🌿挑战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中就可以对行的偏移来进行数据对比

🧨那就不废话了, 开始今天的刷题~~🧨

🎈表结构

hive获取昨天的数据 hive获取前一天日期_hive获取昨天的数据

🎉建表并插入数据

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的规范问题

  1. 尽量把逗号放在前面,为什么?
  1. 方便排查,不会遗漏逗号
  2. 方便注释,可以单行直接注释,不用再改逗号
  3. 排版看起来更紧密,我用datagrip快捷键ctrl + alt+ L可以快速缩进
  4. 特别用datagrip进行快速复制一行的时候,只需要Ctrl + D不需要关注逗号,写起来很快
  1. 使用关键字大写,养成好习惯
  2. 参考 hive sql 官方conf地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual