SQL和HIVE、Tableau中的时间函数处理小技巧
全是工作中遇到的问题,分享给大家是想大家少走弯路、提高工作效率!
1.Tableau :
按月的业绩指标
sum(ifDATETRUNC('month',[v_date])=DATETRUNC('month',[统计年月]) then [业绩指标] else 0 end)
环比
sum(ifDATETRUNC('month',[v_date])=DATETRUNC('month',[统计年月]) then [业绩指标] else 0 end)/sum(ifDATETRUNC('month',[v_date])=DATEADD('month',-1,DATETRUNC('month',[统计年月])) then [业绩指标] else 0 END)-1
sum(ifDATETRUNC('month',[日期])=DATETRUNC('month',[统计日期]) then [业绩指标] else 0 end)/sum(if DATETRUNC('month',[日期])=DATEADD('month',-1,DATETRUNC('month',[统计日期])) then [业绩指标] else 0 END)-1
同比
sum(ifDATETRUNC('month',[v_date])=DATETRUNC('month',[统计年月]) then [业绩指标] else 0 end)/sum(ifDATETRUNC('month',[v_date])=DATEADD('month',-12,DATETRUNC('month',[统计年月])) then [业绩指标] else 0 END)-1
(ifDATETRUNC('month',[日期])=DATETRUNC('month',[统计日期]) then [人效] else 0 end)/(if DATETRUNC('month',[日期])=DATEADD('month',-1,DATETRUNC('month',[统计日期])) then [人效] else 0 END)-1
if[部门类型]='KA' THEN 0 ELSE [加权人数] END) else 0 end )
[日期]=MAKEDATE(YEAR([日期]),MONTH([日期]),01) 当月第一天
if [日期]= MAKEDATE(YEAR([日期]),MONTH([日期]),day(DATEADD('day',-1,MAKEDATE(YEAR(DATEADD('month',1,[日期])),MONTH(DATEADD('month',1,[日期])),01))))then [待摊销金额]
else null
end
按月的业绩指标
sum(ifDATETRUNC('month',[v_date])=DATETRUNC('month',[统计年月]) then [业绩指标] else 0 end)
环比
sum(ifDATETRUNC('month',[v_date])=DATETRUNC('month',[统计年月]) then [业绩指标] else 0 end)/sum(ifDATETRUNC('month',[v_date])=DATEADD('month',-1,DATETRUNC('month',[统计年月])) then [业绩指标] else 0 END)-1
SUM(IF [日期]>=DATETRUNC('month',DATEADD('month',0,[统计日期])) AND [日期] else 0 end )/( [日期]=MAKEDATE(YEAR([日期]),MONTH([日期]),01) 当月第一天 if [日期]= MAKEDATE(YEAR([日期]),MONTH([日期]),day(DATEADD('day',-1,MAKEDATE(YEAR(DATEADD('month',1,[日期])),MONTH(DATEADD('month',1,[日期])),01))))then [待摊销金额] else null end if[部门类型]='KA' THEN 0 ELSE [加权人数] END) else 0 end ) [日期]=MAKEDATE(YEAR([日期]),MONTH([日期]),01) 当月第一天 if [日期]= MAKEDATE(YEAR([日期]),MONTH([日期]),day(DATEADD('day',-1,MAKEDATE(YEAR(DATEADD('month',1,[日期])),MONTH(DATEADD('month',1,[日期])),01))))then [待摊销金额] else null end CONTAINS(str([产品ID]),'820201') ##如果 [产品ID] 含有'820201'则为true。 2.SQL(hive): ##hive v_month>=date(concat( (case whenint(from_unixtime(unix_timestamp(),'MM'))<2 thenint(from_unixtime(unix_timestamp(),'yyyy'))-2 elseint(from_unixtime(unix_timestamp(),'yyyy'))-1 end),'-', (case whenint(from_unixtime(unix_timestamp(),'MM'))<2 thenint(from_unixtime(unix_timestamp(),'MM'))+11 elseint(from_unixtime(unix_timestamp(),'MM'))-1 end),'-01')) where v_month>=date(concat(substr(ADD_MONTHS(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),-13),1,7),'-01')) #前13个月yyyy-MM-dd regexp_replace( substr(ADD_MONTHS(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),-24),1,10),'-','') ## 前13个月yyyyMMdd #mysql: DATE(CONCAT(SUBSTR(DATE_ADD(SYSDATE(),INTERVAL-13 MONTH),1,7),'-01')) ##增加月份 查看分区: show partitions +表名 date_add(date,days)##增加天数 current_date() #当前时间 select v_date from ods_ba.o_m_user_account_remain_daily where(concat(substr(v_date,1,4),'-',substr(v_date,5,2),'-',substr(v_date,7,2)))=last_day((concat(substr(v_date,1,4),'-',substr(v_date,5,2),'-',substr(v_date,7,2)))) group by v_date ###取每月最后一天 权限表: 增加人员 UPDATE`t_hr_authorization` SETuser_list=CONCAT(user_list,'junfan,') WHERE business='name' AND company IN('name1','name2') ##删除人员 UPDATE`t_hr_authorization` SET user_list=REPLACE(user_list,'junfan,','')WHERE business='name' AND company IN('name1','name2') 特别注意相关的数据格式的匹配,在相关数据处理工具中数据格式兼容性会影响ETL. 对于权限的查看,赋予不同的数据权限需要各种数据维表来控制数据权限。 3.R: 数据处理包dplyr,查找最大值的ID: library(dplyr) order <-read.csv("order.csv")## 也可以是不同的数据源:mysql,oracle,sqlite,hadoop, class(order)##查看order的类别 subset.data.frame(order, totalprice >=max(totalprice), ##选出最大价格 select = c(orderid,customerid, totalprice)) ##选出最大价格中的orderid, customerid subset(airquality,Temp > 80, select = c(Ozone, Temp))