mysql或者hive實現分層向下統計功能

2021-07-25 11:29:50 字數 2842 閱讀 2113

原因:作為一名資料人員,經常會碰到類似這樣的表結構:

city_id city_code   city_name   parent_id   citylevel

1 中國 中國 0 0

2 110000 北京市 1 0

3 120000 天津市 1 0

4 130000 河北省 1 0

5 140000 山西省 1 0

6 150000 內蒙古自治區 1 0

7 210000 遼寧省 1 0

8 220000 吉林省 1 0

9 230000 黑龍江省 1

其中parent_id代表本條資料的上一層級id,citylevel代表本條資料的所屬層級,這樣的表結構會把含有多個層級的資料放在一張表中,層級關係用parent_id和citylevel來表示,這種類似於碼表的資料(如城市碼表,標籤碼表)後台開發的同學往往會設計成這樣的表結構。

但是對於應用資料的同學來說,這樣的表結構非常讓人頭疼,因為往往他需要的是一層一層平鋪開來的資料,比如全國、省、市、縣的訂單量各有多少,想實現像資料透視表那樣的效果,比如:

區(縣)id  區(縣)    市id 市   省id 省   全國id    全國  單量

110101 東城區 110000 北京市 110000 北京市 0 全國 3598

110102 西城區 110000 北京市 110000 北京市 0 全國 4973

110105 朝陽區 110000 北京市 110000 北京市 0 全國 4033

110106 豐台區 110000 北京市 110000 北京市 0 全國 3731

110107 石景山區 110000 北京市 110000 北京市 0 全國 4159

110108 海淀區 110000 北京市 110000 北京市 0 全國 4426

110109 門頭溝區 110000 北京市 110000 北京市 0 全國 3370

110111 房山區 110000 北京市 110000 北京市 0 全國 3922

110112 通州區 110000 北京市 110000 北京市 0 全國 3188

110113 順義區 110000 北京市 110000 北京市 0 全國 3902

110114 昌平區 110000 北京市 110000 北京市 0 全國 3257

110115 大興區 110000 北京市 110000 北京市 0 全國 3193

110116 懷柔區 110000 北京市 110000 北京市 0 全國 3319

110117 平谷區 110000 北京市 110000 北京市 0 全國 3103

110228 密雲縣 110000 北京市 110000 北京市 0 全國 4589

110229 延慶縣 110000 北京市 110000 北京市 0 全國 4463

130102 長安區 130100 石家莊市 130000 河北省 0 全國 4273

130103 橋東區 130100 石家莊市 130000 河北省 0 全國 3483

如何實現這樣的效果呢?即將乙個縱向關係表變為乙個橫向關係表?

可以這樣寫:

select

substr(c.finish_time,1,10)

,t1.name

,t2.name

,t3.name,count(c.id)

from tags t1

left join tags t2 on

t2.parent_id=t1.id

left join tags t3 on

t3. parent_id=t2.id

left join orders c on

(c.tag_id=t3.id

or c.tag_id=t2.id

or c.tag_id=t1.id)

where t1.level=1

group by c.tag_id,substr(c.finish_time,1,10)

結論:對於縱向表,可以先將其轉化為橫向的碼表,不論什麼樣的碼表不管有幾層,只要有level 和parent_id這樣的,都可以用如下方式轉化:

select 

t1.name

,t2.name

,t3.name

from tags t1

left

join tags t2 on t2.parent_id=t1.id

left

join tags t3 on t3. parent_id=t2.id

where t1.level=1

或者:

select 

a.`name`

,b.`name`

,c.`name`

from `tags`

a left join tags b on a.`id`=b.`parent_id`

left join tags c on b.`id`=c.`parent_id`

where a.`parent_id` is null

上述sql的層級均為**,如果還有更多的層級,繼續向下join就行了,只要切記在最後的where中限定parent_id或者level即可。

mysql開發分層 mysql的分層以及功能

第一次接觸分層思想是在學習網路的時候,osi7層模型,各層完成自己的任務互相不干擾。在mysql中也採用用這種思想,這麼做的好處就是規定了各層的功能那個,出現什麼問題就去找各層的問題。大大減少了工作量。那麼在mysql中大概分為四層 1 鏈結層 2 服務層 3 儲存引擎層 4 儲存層 一 鏈路層 主...

SparkSql實現Mysql到hive的資料流動

今天去面試了一波,因為排程系統採用了sparksql實現資料從mysql到hive,在這一點上面試官很明顯很不滿我對於spark的理解,19年的第乙個面試就這麼掛了。有問題不怕,怕的是知道了問題還得過且過。現在就來梳理下我的專案是怎麼使用spark導數的 第一步 把mysql中的表放入記憶體 pro...

HIVE資料匯入MYSQL實現方式

以下內容均 其他csdn博主的優秀內容 一 python指令碼導數 import os import pymysql hive sql beeline u jdbc hive2 n 使用者名稱 p 密碼 showheader false outputformat csv2 e select from...