Hive之同比環(huán)比的計(jì)算

Hive系列文章

  1. Hive表的基本操作
  2. Hive中的集合數(shù)據(jù)類型
  3. Hive動(dòng)態(tài)分區(qū)詳解
  4. hive中orc格式表的數(shù)據(jù)導(dǎo)入
  5. Java通過jdbc連接hive
  6. 通過HiveServer2訪問Hive
  7. SpringBoot連接Hive實(shí)現(xiàn)自助取數(shù)
  8. hive關(guān)聯(lián)hbase表
  9. Hive udf 使用方法
  10. Hive基于UDF進(jìn)行文本分詞
  11. Hive窗口函數(shù)row number的用法
  12. 數(shù)據(jù)倉庫之拉鏈表

同比環(huán)比的計(jì)算

測(cè)試數(shù)據(jù)

1,2020-04-20,420
2,2020-04-04,800
3,2020-03-28,500
4,2020-03-13,100
5,2020-02-27,300
6,2020-01-07,450
7,2019-04-07,800
8,2019-03-15,1200
9,2019-02-17,200
10,2019-02-07,600
11,2019-01-13,300
CREATE TABLE ods_saleorder  (
  order_id int ,
  order_time date ,
  order_num int
)ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
;
LOAD DATA LOCAL INPATH '/Users/liuwenqiang/workspace/hive/saleorder.txt' OVERWRITE INTO TABLE ods.ods_saleorder;

銷售量的月年占比

關(guān)聯(lián)實(shí)現(xiàn)

select
    a.m_num,a.cmonth,b.y_num,b.cyear,round( m_num / y_num, 2 ) AS ratio
from(
        select
            sum(order_num) as m_num,
            DATE_FORMAT(order_time,'yyyy-MM') as cmonth
        from
            ods_saleorder
        group by
            DATE_FORMAT(order_time,'yyyy-MM')
    ) a
        inner join
    (
        select
            sum(order_num) as y_num,
            DATE_FORMAT(order_time,'yyyy') as cyear
        from
            ods_saleorder
        group by
            DATE_FORMAT(order_time,'yyyy')
    ) b
 on
    substring(a.cmonth,1,4)=b.cyear
;
image-20210114192005253

窗口實(shí)現(xiàn)

SELECT
    order_month,
    num,
    total,
    round( num / total, 2 ) AS ratio
FROM
    (
        select
            substr(order_time, 1, 7) as order_month,
            sum(order_num) over (partition by substr(order_time, 1, 7)) as num,
            sum(order_num) over (partition by substr( order_time, 1, 4 ) ) total,
            row_number() over (partition by substr(order_time, 1, 7)) as rk
        from ods_saleorder
    ) temp
where rk = 1;

同比環(huán)比

與上年度數(shù)據(jù)對(duì)比稱"同比"宝泵,與上月數(shù)據(jù)對(duì)比稱"環(huán)比"瘦真。
相關(guān)公式如下:

同比增長率計(jì)算公式
(當(dāng)年值-上年值)/上年值x100% 

環(huán)比增長率計(jì)算公式
(當(dāng)月值-上月值)/上月值x100% 

lead lag 的實(shí)現(xiàn)

這里我們就用環(huán)比做個(gè)例子猾封,同比類似

select
    now_month,
    now_num,
    last_num,
    round( (now_num-last_num) / last_num, 2 ) as ratio
FROM(
    select
        now_month,
        now_num,
        lag( t1.now_num, 1) over (order by t1.now_month ) as last_num
    from
        (
            select
                substr(order_time, 1, 7) as now_month,
                sum(order_num) as now_num
            from ods_saleorder
            group by
                substr(order_time, 1, 7)
        ) t1
) t2;
image-20210114203453599

我們看到有null 值凯旋,這里我們可以使用他嫡,lag的默認(rèn)值做一次優(yōu)化

select
    now_month,
    now_num,
    last_num,
    -- 分母是0的話返回值是null
    nvl(round( (now_num-last_num) / last_num, 2 ),0)as ratio
FROM(
    select
        now_month,
        now_num,
        lag( t1.now_num, 1,0) over (order by t1.now_month ) as last_num
    from
        (
            select
                substr(order_time, 1, 7) as now_month,
                sum(order_num) as now_num
            from ods_saleorder
            group by
                substr(order_time, 1, 7)
        ) t1
) t2;
image-20210114203935322

其實(shí)到這里我們就處理完了颖医,但是這樣真的對(duì)嗎枉长,我們看到'2020-01' 的last_num 是800 也就是'2019-04',其實(shí)到這里我們就明白了冀续,我們的數(shù)據(jù)是不連續(xù)的,所以我們這樣計(jì)算是不行的必峰,如果每個(gè)月都齊全洪唐,都有數(shù)據(jù)lag(num,12)就可以。

那就只能做自關(guān)聯(lián)了,這樣的話我們可以對(duì)時(shí)間做精準(zhǔn)的限制

自關(guān)聯(lián)的實(shí)現(xiàn)

with a as (
    select
        now_month,
        now_num,
        substr(date(concat(now_month,'-','01')) - INTERVAL '1' month, 1, 7) as last_month
    from(
         select
             substr(order_time, 1, 7) as now_month,
             sum(order_num) as now_num
         from ods_saleorder
         group by
             substr(order_time, 1, 7)
    ) tmp
)
select
    a1.now_month,a1.now_num,a1.last_month,a2.now_num,
    nvl(round( (a1.now_num-a2.now_num) / a2.now_num, 2 ),0) as ratio
from
    a  a1
inner join
    a a2
on
    a1.last_month=a2.now_month
;
image-20210114210717600

這里的時(shí)間計(jì)算INTERVAL 你也可以換成其他函數(shù)

with a as (
    select
        now_month,
        now_num,
        substr(add_months(concat(now_month,'-','01'),-1), 1, 7) as last_month
    from(
         select
             substr(order_time, 1, 7) as now_month,
             sum(order_num) as now_num
         from ods_saleorder
         group by
             substr(order_time, 1, 7)
    ) tmp
)
select
    a1.now_month,a1.now_num,a1.last_month,nvl(a2.now_num,0),
    nvl(round( (a1.now_num-a2.now_num) / a2.now_num, 2 ),0) as ratio
from
    a  a1
left join
    a a2
on
    a1.last_month=a2.now_month
;

猜你喜歡
Hadoop3數(shù)據(jù)容錯(cuò)技術(shù)(糾刪碼)
Hadoop 數(shù)據(jù)遷移用法詳解
Flink實(shí)時(shí)計(jì)算topN熱榜
數(shù)倉建模分層理論
數(shù)倉建模方法論

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吼蚁,一起剝皮案震驚了整個(gè)濱河市凭需,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肝匆,老刑警劉巖粒蜈,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異术唬,居然都是意外死亡薪伏,警方通過查閱死者的電腦和手機(jī)滚澜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門粗仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事借浊√潦纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵蚂斤,是天一觀的道長存捺。 經(jīng)常有香客問我,道長曙蒸,這世上最難降的妖魔是什么捌治? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮纽窟,結(jié)果婚禮上肖油,老公的妹妹穿的比我還像新娘。我一直安慰自己臂港,他們只是感情好森枪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著审孽,像睡著了一般县袱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佑力,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天式散,我揣著相機(jī)與錄音,去河邊找鬼打颤。 笑死杂数,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘸洛。 我是一名探鬼主播揍移,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼反肋!你這毒婦竟也來了那伐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤石蔗,失蹤者是張志新(化名)和其女友劉穎罕邀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养距,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诉探,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棍厌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肾胯。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竖席,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敬肚,到底是詐尸還是另有隱情毕荐,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布艳馒,位于F島的核電站憎亚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弄慰。R本人自食惡果不足惜第美,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陆爽。 院中可真熱鬧斋日,春花似錦、人聲如沸墓陈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贡必。三九已至兔港,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仔拟,已是汗流浹背衫樊。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留利花,地道東北人科侈。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像炒事,于是被迫代替她去往敵國和親臀栈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容