自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

第37期:JOIN延伸 - 維度查詢(xún)語(yǔ)法

企業(yè)動(dòng)態(tài)
通俗來(lái)講,我們把用來(lái)分類(lèi)的屬性(字段)稱(chēng)為維度,有了前面文章里的維度定義后,我們就可以來(lái)梳理前面講過(guò)的簡(jiǎn)化JOIN語(yǔ)法了。

【數(shù)據(jù)蔣堂】第37期:JOIN延伸 - 維度查詢(xún)語(yǔ)法

有了前面文章里的維度定義后,我們就可以來(lái)梳理前面講過(guò)的簡(jiǎn)化JOIN語(yǔ)法了。

先定義字段維度:

  1. 維度字段的維度為其本身;
  2. 外鍵字段的維度為相應(yīng)外鍵表中關(guān)聯(lián)字段的維度;
  3. 測(cè)度字段沒(méi)有維度;

這是個(gè)遞歸定義。

然后再?lài)?yán)格定義同維表和主子表:

同維表:兩個(gè)表的主鍵字段維度集合對(duì)應(yīng)相同,則稱(chēng)兩個(gè)表同維;

主子表:某個(gè)表的主鍵字段維度集合是另一個(gè)表的主鍵字段維度集合的真子集,則前者稱(chēng)為后者的主表,后者為前者的子表;

按這個(gè)定義,容易得到這些結(jié)論:

  • 同維表的同維表是同維表,同維表是等價(jià)關(guān)系;
  • 主表的同維表是主表,子表的同維表是子表;子表的子表是子表;

還要定義表的廣義字段:

  1. 本表的字段是其廣義字段;
  2. 廣義字段作為普通字段的所在表的同維表的字段是廣義字段;
  3. 某廣義字段是外鍵字段時(shí),那么它對(duì)應(yīng)的外鍵表的字段是廣義字段;
  4. 廣義字段的維函數(shù)是廣義字段;

這還是個(gè)遞歸定義。

回顧前面的例子來(lái)理解:

  1. SELECT * FROM employee WHERE nationality='美國(guó)' AND department.manager.nationality='中國(guó)' 
  2. SELECT id,name,salary+allowance FROM employee 

其中department.manager.nationality,salary,allowance都是表employee的廣義字段。

有了廣義字段概念后,前面所說(shuō)的消除關(guān)聯(lián)的語(yǔ)法就是很自然的事了。在SQL語(yǔ)法中允許將表的廣義字段當(dāng)作普通字段引用,就可以實(shí)現(xiàn)外鍵屬性化和同維表等同化,再允許將子表的廣義字段作為集合字段在本表運(yùn)算時(shí)進(jìn)行聚合運(yùn)算,就實(shí)現(xiàn)了主子表一體化。結(jié)合前面文章中的例子很容易理解。

這種改進(jìn)的語(yǔ)法以維度概念作為核心 ,為和SQL區(qū)別,我們把它稱(chēng)為DQL(D是Dimension)。

我們?cè)賮?lái)解決維度對(duì)齊中的那個(gè)小漏洞,考查前面文章中的例子:

  1. SELECT Contract.SUM(price), Payment.SUM(amount), Invoice.SUM(amount) 
  2.         FROM Contract GROUP BY date FULL JOIN Payment GROUP BY date FULL JOIN Invoice GROUP BY date 

這個(gè)查詢(xún)是想按日期分別統(tǒng)計(jì)合同額、回款額及發(fā)票額,但選出的字段(表達(dá)式)中并沒(méi)有作為關(guān)鍵字段的日期,而只有一些合計(jì)數(shù),這會(huì)得到一個(gè)讓人看不懂的結(jié)果集。

這里參與JOIN的三個(gè)表中都有date字段,選任何一個(gè)放在SELECT中都是不合適的,因?yàn)槿魏我粋€(gè)表都可能有日期不全的情況,而且這三個(gè)表是完全對(duì)稱(chēng)的關(guān)系,也沒(méi)有道理讓其中任何一個(gè)特殊化。這種情況時(shí),在SQL中大概要寫(xiě)成

coalesce(Contract.date,Payment.date,Invoice.date)的形式(Oracle語(yǔ)法),有點(diǎn)繁瑣。

當(dāng)我們從數(shù)據(jù)庫(kù)結(jié)構(gòu)中已經(jīng)抽取出維度之后,就可以較方便地解決這個(gè)問(wèn)題了。顯然,這幾個(gè)date都是有維度的字段,我們把這個(gè)維度命名為DATE,那么上面語(yǔ)句可以寫(xiě)成這樣:

  1. SELECT Contract.SUM(price), Payment.SUM(amount), Invoice.SUM(amount) ON DATE 
  2.         FROM Contract GROUP BY date FULL JOIN Payment GROUP BY date FULL JOIN Invoice GROUP BY date 

增加一個(gè)ON子句來(lái)指明用于對(duì)齊的目標(biāo)維度,這些維度會(huì)自動(dòng)被選出到結(jié)果集,并處理空值的情況。

類(lèi)似地,后一個(gè)例子應(yīng)當(dāng)寫(xiě)成:

  1. SELECT Sales.COUNT(1), Contract.SUM(price) ON AREA 
  2.         FROM Sales GROUP BY area FULL JOIN Contract GROUP BY customer.area 

用于向維度對(duì)齊的字段還可以是廣義字段。

另外,在有了維函數(shù)概念后,還可以進(jìn)一步簡(jiǎn)化某些查詢(xún)。

比如前面那個(gè)三表對(duì)齊的例子中,我們希望按月而不是按日期統(tǒng)計(jì),當(dāng)然可以寫(xiě)成:

  1. SELECT Contract.SUM(price), Payment.SUM(amount), Invoice.SUM(amount) ON MONTH 
  2.         FROM Contract GROUP BY month(date) FULL JOIN Payment GROUP BY month(date) FULL JOIN Invoice GROUP BY month(date) 

其中month是一個(gè)維函數(shù),以日期為參數(shù),返回MONTH維度取值。

不過(guò),維函數(shù)在數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)時(shí)就已經(jīng)定義好了,在明確知道對(duì)齊維度時(shí),可以根據(jù)用來(lái)對(duì)齊的字段自動(dòng)尋找一個(gè)合適的維函數(shù)來(lái)用,這樣上面的句子簡(jiǎn)化成不寫(xiě)維函數(shù)也不會(huì)有歧義:

  1. SELECT Contract.SUM(price), Payment.SUM(amount), Invoice.SUM(amount) ON MONTH 
  2.         FROM Contract GROUP BY date FULL JOIN Payment GROUP BY date FULL JOIN Invoice GROUP BY date 

想改變統(tǒng)計(jì)維度的層次時(shí),只要改寫(xiě)ON的部分即可,GROUP BY部分可以不動(dòng)。

 

我們知道,在多維分析時(shí)為了提高性能常常會(huì)做預(yù)先匯總,也就是根據(jù)分析中可能出現(xiàn)的維度組合事先把測(cè)度的統(tǒng)計(jì)值計(jì)算好保存起來(lái),需要時(shí)直接引用而不必再?gòu)念^遍歷計(jì)算。而把所有組合情況都預(yù)先匯總是不大現(xiàn)實(shí)的(因?yàn)榇鎯?chǔ)空間過(guò)大),一般只能選擇最常用的維度組合。

這樣有兩個(gè)問(wèn)題:

  1. 若干套匯總數(shù)據(jù)和一個(gè)基礎(chǔ)數(shù)據(jù)是如何對(duì)應(yīng)的?
  2. 怎么知道哪些組合是最常用的?

在SQL體系下,如果是針對(duì)沒(méi)有關(guān)聯(lián)運(yùn)算的單表,那么這兩個(gè)問(wèn)題都不是很難處理?;A(chǔ)數(shù)據(jù)就是一個(gè)單表,匯總數(shù)據(jù)和這個(gè)表的某些維度組合對(duì)應(yīng);將歷史分析過(guò)程記錄下來(lái)之后,就可以統(tǒng)計(jì)出哪些維度組合最常用,從而指導(dǎo)匯總數(shù)據(jù)的建設(shè)。

但是,如果允許關(guān)聯(lián)運(yùn)算,多維分析過(guò)程中會(huì)拼出帶JOIN的SQL來(lái),這個(gè)問(wèn)題就復(fù)雜多了?;陉P(guān)系代數(shù)的JOIN定義,很難描述匯總數(shù)據(jù)與基礎(chǔ)數(shù)據(jù)的對(duì)應(yīng)關(guān)系,而維度組合也隱藏在SQL的JOIN語(yǔ)法句,很難拆出來(lái)當(dāng)前的查詢(xún)到底在針對(duì)那些維度進(jìn)行匯總。

而使用DQL就簡(jiǎn)單多了。匯總數(shù)據(jù)和基礎(chǔ)數(shù)據(jù)的對(duì)應(yīng)問(wèn)題,僅僅是把普通字段推廣到廣義字段,邏輯上看仍然是個(gè)單表。而DQL語(yǔ)句中能很清晰明了地看出每句查詢(xún)是是在針對(duì)哪些維度(廣義字段)匯總,這樣就就很容易統(tǒng)計(jì)最常用的維度組合。

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2018-01-01 23:28:37

JOIN維度數(shù)據(jù)分析

2018-01-10 15:19:59

JOIN維度SQL

2017-12-12 22:48:21

JOIN維度運(yùn)算

2017-11-08 06:18:43

JOINSQL運(yùn)算

2017-12-26 15:33:24

JOINSQL運(yùn)算

2017-11-15 06:36:25

JOINSQL運(yùn)算

2017-12-10 22:42:50

JOINSQL運(yùn)算

2017-09-05 22:34:24

遍歷SQL運(yùn)算

2017-09-13 08:45:33

遍歷SQL運(yùn)算

2017-12-10 22:48:53

JOIN運(yùn)算外鍵

2012-06-01 14:49:07

豌豆莢設(shè)計(jì)獎(jiǎng)Tawkon

2017-12-12 22:58:57

JOIN外鍵運(yùn)算

2017-08-16 15:31:31

SQL語(yǔ)法集合化

2011-11-25 13:10:43

安全技術(shù)周刊

2017-08-22 21:55:18

SQL語(yǔ)法離散性

2018-03-14 07:47:41

大數(shù)據(jù)語(yǔ)法SQL

2017-08-09 16:13:48

SQL大數(shù)據(jù)語(yǔ)法

2010-09-09 15:43:13

SQLjoin語(yǔ)法

2016-12-28 14:19:43

智能運(yùn)營(yíng)APS

2018-08-31 10:42:03

AWSAI云服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)