您好,登錄后才能下訂單哦!
本篇內容主要講解“Hive有哪些常見函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hive有哪些常見函數”吧!
https://www.w3school.com.cn/sql/func_date_format.asp
year(string date):返回年份部分的日期或時間戳字符串:year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970
https://blog.csdn.net/wzzfeitian/article/details/55097563
https://www.yiibai.com/hive/hive_built_in_functions.html
數據類型轉換:https://blog.csdn.net/qq_31573519/article/details/100139218
//獲取上個月第一天 date('Y-m-01',strtotime('-1 month')); //獲取上個月最后一天 date('Y-m-t',strtotime('-1 month'));
SELECT --上個月第一天 concat(SUBSTR(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAY(FROM_UNIXTIME(UNIX_TIMESTAMP()))),1,7) ,'-01'), --上個月最后一天 DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP()),DAY(FROM_UNIXTIME(UNIX_TIMESTAMP()))) select --上個月第一天 trunc(add_months(CURRENT_TIMESTAMP,-1),'MM'), --上個月第一天 concat(substr(add_months(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),-1),1,7),'-01'), --上個月最后一天 date_sub(trunc(CURRENT_TIMESTAMP,'MM'),1);
-- 當月第一天 SELECT TRUNC(sysdate(0), 'MM') ;
-- 前兩個月第一天 select TRUNC(add_months(CURRENT_TIMESTAMP, -2), 'MM');
cast(column_name as decimal(10,2)) cast函數四舍五入(推薦使用) select cast(68.666666666666668 as decimal(10,2)); _c0 68.67 select cast(68.666666666666668 as decimal(10,3)); _c0 68.667
ROUND((SUM(delivered_num) / SUM(plan_num) * 100),2) cast(column_name as decimal(10,2)) cast函數四舍五入(推薦使用) CAST((SUM(delivered_num) / SUM(plan_num) * 100) AS DECIMAL(10, 2))
SELECT CAST( CAST('913' AS DOUBLE) / CAST('1000' AS DOUBLE) * cast('100' as DOUBLE) as DECIMAL(10,2) ); 先轉成 double,在進行乘除運算,最后再轉成 decimal ==> 91.3 列別名一定要用"雙引號"
if null 判斷語句
函數: 1. coalesce( value1,value2,… ) 2. if( value1 is null, value2, value1) IF( Test Condition, True Value, False Value ) 例子: hive> select coalesce(col1, col2, cols) as res1, if(col1 is null, if(col2 is null, col3, col2), col1) as res2 > from( > select 1 as col1, 2 as col2, 3 as col3 > union all > select null as col1, 2 as col2, 3 as col3 > union all > select null as col1, null as col2, 3 as col3 > union all > select null as col1, null as col2, null as col3 > ) as test 結果: res1 res2 1 1 2 2 3 3 null null
背景:假設我們是一個電商網站,用用戶下單,訂單有來源數據,每個訂單會有多個訂單明細,訂單明細記錄了商品相關信息、以及商品的出庫、發(fā)貨、收貨時間都不同。
需求:想要統計訂單維度相關的數據,要求統計出訂單不同來源下的出庫單量、發(fā)貨單量、收貨單量。
分析:訂單和訂單明細是一對多的關系,一個訂單有多個明細,每個明細的商品都有各自的出庫、發(fā)貨、收貨時間,也有可能未及時發(fā)貨、出庫、收貨之類的導致為空,想要按照訂單維度統計這些量,只需要判斷訂單中對應的多個明細中,只有出庫、發(fā)貨。收貨時間即可,然后再匯總。
實現:
先統計基礎的數據,訂單與訂單明細關聯,查詢訂單id、訂單來源、以及根據出庫時間、發(fā)貨時間、收貨時間是否存在來判斷是否出庫、是否發(fā)貨、是否收貨;
根據訂單來源、訂單id進行分組,然后利用單行函數 max 取出具體id分組下的是否出庫、發(fā)貨、收貨值;
最后在統計上一步查的數據,再按照訂單來源分組,利用單行函數 sum 來求訂單總數、出庫、發(fā)貨、收貨總單量。
此時就需要使用 group by 進行分組,同時,分組完畢之后,在 select 列上需要針對未分組的字段進行單行函數,比如 max、min、sum等等。
with base_data as ( select source, -- 下單來源 max(if_out) if_out, -- 是否出庫 max(if_send) if_send, -- 是否發(fā)貨 max(if_received) if_received -- 是否收貨 from ( select o.id, -- 訂單id o.source, -- 來源 ( case when od.out_time is not null then 1 else 0 end ) as if_out, -- 是否出庫 ( case when od.send_time is not null then 1 else 0 end ) as if_send, -- 是否發(fā)貨 ( case when od.received_time is not null then 1 else 0 end ) as if_received -- 是否收貨 from order o left join order_detail od on o.id = od.order_id where o.create_time > '2021-04-01' ) a group by source,id ) select source, -- 下單來源 sum(1), -- 訂單數量 sum(if_out), -- 出庫總單量 sum(if_send), -- 發(fā)貨總單量 sum(if_received) -- 收貨總單量 from base_data group by source
其實就是一個訂單包含多個商品數據,每個商品的三種不同的時間都不同,想要算按照整個訂單來統計三個時間,只需要取訂單對應的多個商品數據,取它們的最小或最大時間來進行分組統計。
注意 distinct 只是針對整行數據去重,如果查詢結果有多列,比如 user_id、name、age、order_id 等等,查詢的數據中 user_id、name、age 都是一樣的,但是 order_id 有多個,那么使用 distinct 只會去除四個字段相同的行數據。
到此,相信大家對“Hive有哪些常見函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。