常用sql

常用函数

coalesce(t1.item_without_tax_total_amt,0)

SELECT from_unixtime( unix_timestamp('20220101','yyyyMMdd'),'yyyy-MM-dd');


4.1 聚合函数
        Hive支持count(),max(),min(),avg()等常用的聚合函数。

4.2 关系函数
        支持 =, !=, <>, < , >, <= , >, >=

        空值判断:is nullis not null.

        relike, regexp操作。

4.3 数学运算
        支持所有的数值类型: + , - , * , /%& , | , ^, ~等。

4.4 逻辑运算
        逻辑与: and

        逻辑或: or

        逻辑非: not

4.5 数值运算
取整函数: round()

round(double a)    返回值bigint,返回double类型的整数值部门(遵循四舍五入)

指定精度取整函数

round(double a, int d)  返回值double。返回指定指定精度d的double类型。

向下取整函数

floor(double a )返回等于或者大于该double变量的最小的整数。

向上取整函数

ceil(double  a)   返回等于或者大于该double 变量的最小的整数;

取随机函数

rand(), rand(int  seed):返回一个01范围内的随机数。

自然指数函数

exp():  返回自然对数e的a次方。

幂运算函数

pow(double  a, double  p):  返回a的p次幂。

开平方函数

sqrt(double a): 返回a的平方根。

4.6 条件函数
if函数

if(boolean  testCondition,T  valueTrue,  T  valueFalseOrNull)

当条件testCondition为True时候,返回valueTrue,否则返回valueFalseOrNull

非空查找函数coalesce

coalesce(T  v1,  T v2,.....) 

返回参数中第一个非空值,如果所有值都为null,那么返回Null。

条件判断函数case when

case when写法一:

case sex 

        when   '1'    then   '男'

        when   '2'    then   '女'

else   '其他'  end

case when写法二:

case when sex = '1'  then  '男'

         when sex = '2'  then  '女'

else   '其他'  end

4.7 日期函数
1.unix_timestamp函数的三种情况:

获取当前时间戳函数:  unix_timestamp

            语法:unix_timestamp();     

            返回值:bigint ,获得当前时区的unix时间戳

            样例:select  unix_timestamp()  from  table;

日期转unix时间戳函数:unit_timestamp

            语法:unix_timestamp(String  date)

            返回值:bigint

            说明:将格式为”yyyy-MM-dd HH:ss”的日期转换到unix时间戳,如果转换失败,则返回0.

将指定格式日期转unix时间戳函数:unix_timestamp() 

语法:unix_timestamp(string date, string pattern)

返回值:bigint

说明:转换pattern格式日期到unix时间戳。如果转化失败,则返回0.

样例:select  unix_timestamp('2021-03-08 14:21:11','yyyy-MM-dd HH:mm:ss') from table

2.unit时间戳转日期函数: from_unixtime

from_unixtime()

            语法:from_unixtime(bigint  unixtime)

            返回值:string

            说明:把具体的秒转化为时间日期。

3.获取当前的时间精确到毫秒

current_timestamp()

            样例:select current_timestamp()  -- 2011-09-02 10:11:09.234212000

4.日期时间转日期函数:to_date

年月日时分秒只取其中的年月日部分:to_date()

            语法:to_date(string  timestamp)

            返回值:string   返回日期时间部分的日期。

            样例:select  to_date('2021-09-02 12:09:09') from table

5.日期转年///小时/分钟//周函数

日期转年函数year()

语法:year(String date)

返回值:int   返回日期中的年

样例:select  year('2021-03-21 10:11:02') from table

日期转月函数mounth

            返回日期中的月

日期转天函数day

返回日期中的天

日期转小时函数:hour

返回日期中小时函数

日期转分钟函数minute

            返回日期中的分钟

日期转秒函数second

            返回日期中的秒

日期转周函数 weekofyear

            weekofyear(string  date)

            返回值为int,返回日期在当前的周数

6.日期操作函数

日期比较函数:datediff

            语法:datediff(string   enddate, string  startdate)

            返回值:int  返回结束日期减去开始日期

日期增加函数 :date_add

语法:date_add(string startdate, int days)

返回值string,返回开始日期startdate增加days天的日期。

日期减少函数 date_sub

            语法:date_sub(string startdate, int days)

            返回值:string. 返回开始日期startdate减少days天后的日期。

4.8 字符串函数
字符串长度函数: length()

            length(string a): 返回字符串a的长度

字符串反转函数:reverse

            reverse(string  a) :返回字符串a的反转结果

字符串连接函数

            不带分隔符的字符串连接函数concat()

                    语法:concat(string A, string B,........)

                    返回输入字符串连接后的结果,支持任意个输入字符串

            带分隔符字符串连接函数 concat_ws()

                    concat_ws(String SEP, string a, string b)

                    返回输入字符串连接后的结果,sep表示各个字符串之间的分隔符。

4.9 字符串截取函数 
substr(string a, int start, int len)

            返回字符串a从start位置开始,长度为len的字符串。

substring(string a, int start, int len)

返回字符串a从start位置开始,长度为len的字符串。

字符串分割函数:split

 语法:split(string  str, string pat) 

4.10 去空格函数
去空格函数trim

             去掉字符串两边的空格

左边去空格ltrim

            ltrim(string  a) 去掉字符串左边的空格。

右边去空格函数

rtrim(string a)去掉字符串右边的空格。

4.11 正则表达式与解析函数
正则表达式替换函数regexp_replace(string a, string b, string c)

            将字符串a中符合java正则表达式b的部分替换为c.注意在有些情况下需要使用转义字符.    
            样例:select  regexp_replace('foobar', 'oo|ar' , '') from table_Name;

正则表达式解析函数:regexp_extract(string subject, string pattern, int index)

            样例:select  regexp_extract('foothebar', 'foo(.*?)(bar)', 1) from tableName; 

             将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

url解析函数: parse_url

样例:parse_url(string  urlString, string  partToExtract  [,  string  keyToExtract] )

说明:返回url中指定的部分。

json解析:get_json_object()

            语法:get_json_object(string  json_string, string  path)

            样例:select  get_json_object('{......}', '$.owner')  from  tableName;

4.12 explode函数
    todo:结合百度需求进行总结

4.13 行转列与列转行
1.行转列

concat(string a/col, string b/col,.....):返回输入字符串连接后的结果,支持任意个输入字符串。

concat_ws(separator, str1, str2,....):它是一个特殊形式的concat

collect_set(col):将某字段的值进行去重汇总,产生array类型字段。

2.列转行

explode(col)

           将hive一列中复杂的array或者map结构拆成多行。可以结合lateral view进行使用。

4.14 基础窗口函数与分析函数
4.14.1 窗口函数简介
        在sql中有一类函数叫做聚合函数,例如sum(), avg(),max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲,聚集后的行数是要少于聚集前的行数的。但是有时候我们既想要显示聚集前的数据,又要显示聚集后的函数,这个时候,我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数.

        窗口函数最重要的关键字是partition byorder by.具体语法是:over(partition  by  用于分组的列名  order  by  用于排序的列名)4.14.2 窗口的含义
1)如果不指定rows between,默认为从起点到当前行;

2)如果不指定order by,则将分组内所有值累加;

3)理解rows between的含义,也叫window子句:

          preceding:往前;

          following:往后;

          current row: 当前行;

          unbounded:起点;

          unbounded  preceding : 表示从前面的起点;

          unbounded  following : 表示到后面的终点;

4.14.3 窗口函数分类
1)专用窗口函数:包括dense_rank(),rank(),row_number()等。

2)聚合函数:例如sum(), avg(),max(),min(),count().

样例1select   *,
       

sum(play_rate) over(order by user_id),
       

avg(play_rate) over(order by user_id),
       

max(play_rate) over(order by user_id),
       

min(play_rate) over(order by user_id),
       

count(play_rate) over(order by user_id)


from haokan_ads_test02;

样例1测试结果:

样例1分析:

    聚合函数在窗口函数中,是对自身记录及位于自身记录以上的数据进行求和的结果。eg:user_id为4的时候,在使用sum()窗口函数后的结果,是对1234号deplat_rate求和。

注意1:可以注意到专用窗口函数括号里面是空的,什么也没有写,但是聚合函数后面括号不能为空,需要指定聚合的列名。

注意2:因为窗口函数是对where或者group by子句处理后的结果进行的操作,所以窗口函数原则上只能写在select子句中。

注意3:聚合函数对应的窗口函数都是对自身记录,以及自身记录之上的所有数据进行计算。如果想看所有人的聚合情况,我们直接看输出结果的最后一行即可。

4.14.4 窗口函数的使用
1)为什么叫窗口函数:这是因为partition by分组以后的结果叫做窗口,这里的窗口是范围的意思。窗口函数同时具有分组和排序的功能;不减少原有表的行数

2)带partition by使用区别:

      窗口函数中的partition by子句可以省去,但是此时就失去了分组的功能。

      窗口函数一般用于排名问题和top-N问题。

3)dense_rank(),rank(),row_number()区别

DENSE_RANK() :排序相同时,会重复、总数会减少。1,1,2

Rank()  :排序相同时,会重复,但是总数不会变。 1,1,3

ROW_NUMBER(): 会根据顺序计算。12,3

4.14.5 窗口函数与group by区别
         group by分组汇总会改变行数(默认返回每组中的第一行);而窗口函数不会减少原表中的行数。

4.16 高级窗口函数 (todo)
ntile;

lag:

     lag(col,n,default)用于统计窗口内往上第n行值;第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为null时候,取默认值,如果不指定,则为null)

lead:

        与lag相反。lead(col,n, default)用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行,第三个参数为默认值。

first_value

        取分组内排序后,截止到当前行,第一个值。

last_value:

         取分组内排序后,截止到当前行,最后一个值。

4.17集合操作函数(todo)
grouping  sets

grouping_id

cube

rollup
4.18类型转换函数
    cast (字段名  as   转换的类型)


	   

数据验证

--数据验证

select 1 as c1,'cn_dim_dev_dl_tables.dim_item_sams_label_info_df' as c2,'数据量一致性'      as c3, t1.cnt1 - t2.cnt1  as c4
from 
(select count(1) as cnt1 from cn_dim_dev_dl_tables.dim_item_sams_label_info_df) t1
join (select count(1) as cnt1 from cn_dim_dl_tables.dim_item_sams_info_all_df ) t2
union  all
select 2 as c1,'cn_dim_dev_dl_tables.dim_item_sams_label_info_df' as c2,'主键唯一性'  as c3, count(1)  as c4
from  (
select 1 from cn_dim_dev_dl_tables.dim_item_sams_label_info_df group by ts,item_nbr having count(1) >1 ) t1
union  all
select 3 as c1,'cn_dim_dev_dl_tables.dim_item_sams_label_info_df' as c2,'主键为空' as c3, t1.cnt1  as c4
from 
(select count(1) as cnt1 from cn_dim_dev_dl_tables.dim_item_sams_label_info_df group by ts is null or item_nbr is null ) t1

复制单个分区到多个分区

create external table cn_dw_dev_dl_tables.dws_item_sams_cbec_sales_mid_di
like 
cn_dw_dl_tables.dws_item_sams_cbec_sales_mid_di
stored as orc tblproperties('external.table.purge'='true');




set hive.exec.dynamic.partition=true; 
set hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE cn_dw_dev_dl_tmp.dwd_item_sams_cbec_master_info_df_tmp20230310 PARTITION(ts)
SELECT   t1.year_date      
        ,t1.month_date     
        ,t1.item_nbr       
        ,t1.channel        
        ,t1.item_name      
        ,t1.brand_name     
        ,t1.category       
        ,t1.eos            
        ,t1.rate           
        ,t1.is_direct_mail 
        ,t1.caliber        
        ,t1.unit_cost      
        ,t1.etl_load_time  
        ,r.ts            --partition column is the last one
  FROM cn_dw_dl_tables.dwd_item_sams_cbec_master_info_df t1 
       CROSS JOIN 
        (
       select date_add ('2022-01-01',s.i) as ts,s.x 
  from ( select posexplode(split(space(datediff('2022-01-30','2022-01-01')),' ')) as (i,x) ) s
        ) r
 WHERE t1.ts='2023-03-09'
DISTRIBUTE BY r.ts;




INSERT OVERWRITE TABLE cn_dw_dl_tables.dwd_item_sams_cbec_master_info_df PARTITION(ts)
SELECT   t1.year_date      
        ,t1.month_date     
        ,t1.item_nbr       
        ,t1.channel        
        ,t1.item_name      
        ,t1.brand_name     
        ,t1.category       
        ,t1.eos            
        ,t1.rate           
        ,t1.is_direct_mail 
        ,t1.caliber        
        ,t1.unit_cost      
        ,t1.etl_load_time  
        ,t1.ts            --partition column is the last one
  FROM cn_dw_dev_dl_tmp.dwd_item_sams_cbec_master_info_df_tmp20230310 t1 
  where t1.ts <'2022-07-01';
  
  
select t2.brand,t2.start_date,t2.end_date,t3.x,t3.y,date_add(t2.start_date,t3.x)
from (  
select  
t1.brand,t1.start_date,t1.end_date,datediff(t1.end_date,t1.start_date)as diff,split(space(datediff(t1.end_date,t1.start_date)),'') as a 
from (  
      select  'hw' as brand,'2023-01-10'as start_date ,'2023-01-20' as end_date) t1
      ) t2
lateral view posexplode(a) t3 as x,y
where t3.x%2=1 ;
      
      

sql规范示例脚本

select t1a.store_nbr                                                         as store_nbr            -- 注释
     , case when t1b.closed_date is not null 
             and floor(months_between(trunc(t1b.closed_date,'MM'),trunc(t1a.visit_date,'MM'))) <= 0 then 
                  'N'
            when t1b.closed_date is not null 
             and floor(months_between(trunc(t1b.closed_date,'MM'),trunc(t1a.visit_date,'MM'))) > 0 then 
                  'Y' --条件1:判断Closed Date是否为空,若不为空,判断其所在月份(年/月)是否小于等于业务时间所在月份(年/月),若小于等于,则该业务时间该门店为非可比店;
       else 
          case when t1b.comp_date is not null 
                and floor(months_between(trunc(t1b.comp_date,'MM'),trunc(t1a.visit_date,'MM'))) <= 0 then 
                     'Y'
               when t1b.comp_date is not null 
                and floor(months_between(trunc(t1b.comp_date,'MM'),trunc(t1a.visit_date,'MM'))) > 0 then 
                     'N' --条件2:再判断comp date是否为空,若不为空,判断其所在月份(年/月)是否小于等于业务时间所在月份(年/月),若小于等于,则该业务时间该门店为可比店;
          else 
              case when t1b.g_o_date is not null 
                    and floor(months_between(trunc(t1a.visit_date,'MM'),trunc(t1b.g_o_date,'MM'))) >= 13 then 
                         'Y'
                   when t1b.g_o_date is not null 
                    and floor(months_between(trunc(t1a.visit_date,'MM'),trunc(t1b.g_o_date,'MM'))) < 13 then 
                         'N' --条件3:判断g.o date是否为空,若不为空,判断业务时间所在月份(年/月)是否大于等于g.o date所在月份(年/月)13个月,若大于等于,则该业务时间该门店为可比店;
              else 
                  'N' --以上都不满足则其他情况该门店为非可比店
              end 
          end 
       end                                                                   as comp                 -- 可比店
     , case when t1b.store_type is null then 'other' else t1b.store_type end as store_type           -- 注释 
     , case when t1b.region     is null then 'other' else t1b.region     end as region               -- 注释
     , case when t1b.dm         is null then 'other' else t1b.dm         end as dm                   -- 注释
     , case when t1b.city       is null then 'other' else t1b.city       end as city                 -- 注释
     , coalesce(t1b.city,'other')                                            as city                 -- 注释
     , t1a.visit_date                                                        as visit_date           -- 注释
     , t1a.hierarchy_nbr                                                     as hierarchy_nbr        -- 注释
     , case when t1a.sales_classification = 'offline' then 'Offline'
            when t1a.sales_classification = 'online'  then 'Online'
            when t1a.sales_classification = 'Total'   then 'Total'
       else 'other' 
       end                                                                   as sales_classification -- 注释
     , t1a.netsales                                                          as netsales             -- 注释
     , t1a.target_netsales                                                   as target_netsales      -- 注释
     , first_value(t1a.netsales) over(partition by t1a.visit_date
                                                 , t1a.hierarchy_nbr
                                                 , coalesce(t1b.city,'other')
                                      order by t1a.visit_date desc
                                     )                                       as first_netsales       -- 注释
  from (
          -- 语句块注释
          select                                               -- 注释
               , store_nbr             as store_nbr            -- 注释
               , visit_date            as visit_date           -- 注释
               , hierarchy_nbr         as hierarchy_nbr        -- 注释
               , sales_classification  as sales_classification -- 注释
               , channel               as channel              -- 注释
               , netsales              as netsales             -- 注释
               , target_netsales       as target_netsales      -- 注释
               , ly_netsales           as ly_netsales          -- 注释
               , netsales_std          as netsales_std         -- 注释
               , target_netsales_std   as target_netsales_std  -- 注释
               , ly_netsales_std       as ly_netsales_std      -- 注释
            from cn_fin_morningreport_dl_tables.tmp_countdown_d_level0 t2a -- 表注释

          union all
          
          -- 语句块注释
          select t2b.store_nbr                as store_nbr               -- 注释
               , t2b.visit_date               as visit_date              -- 注释
               , t2b.hierarchy_nbr            as hierarchy_nbr           -- 注释
               , t2b.sales_classification     as sales_classification    -- 注释
               , t2b.channel                  as channel                 -- 注释
               , sum(t2b.netsales)            as netsales                -- 注释
               , sum(t2b.target_netsales)     as target_netsales         -- 注释
               , sum(t2b.ly_netsales)         as ly_netsales             -- 注释
               , sum(t2b.netsales_std)        as netsales_std            -- 注释
               , sum(t2b.target_netsales_std) as target_netsales_std     -- 注释
               , sum(t2b.ly_netsales_std)     as ly_netsales_std         -- 注释
            from database_name.tmp_countdown_d_level1 t2b -- 表注释
           group by store_nbr
                  , visit_date
                  , hierarchy_nbr
                  , sales_classification
                  , channel
       ) as t1a
  left join (
               -- 注释,只有当t2c中的字段全部用到时才允许使用“* ”,否则只取用到的字段
               select * 
                 from cn_core_dim_dl_tables.dim_store_info as t2c -- 表注释
            ) t1b 
    on t1b.store_nbr = t1a.store_nbr                              
  left join cn_core_dim_dl_tables.dim_item_info            as t1c -- 表注释
    on lower(t1a.hierarchy_nbr) = lower(t1c.hierarchy_nbr)        
  left join cn_core_dim_dl_tables.dim_countdown_date_info  as t1d -- 表注释
    on t1a.visit_date = t1d.countdown_date
  left join cn_core_dim_dl_tables.dim_channel_info         as t1e -- 表注释
    on t1a.channel = t1e.channel_short_name
 inner join cn_core_dim_dl_tables.dim_store_info           as t1f -- 表注释
    on t1f.store_nbr = t1a.store_nbr
 where t1b.store_nbr is not null 
   and t1d.countdown_date is not null
 group by t1a.visit_date
        , t1a.hierarchy_nbr
 order by t1a.visit_date asc 
        , t1a.hierarchy_nbr desc
 having count(1) > 1
        
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值