閱讀53 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據蔣堂 | 有序遍曆語法

上一期數據蔣堂為你介紹遍曆運算中的可能情況,並討論SQL語法在這方麵的表現:

數據蔣堂 | 常規遍曆語法

這期我們將繼續討論遍曆運算的語法規則。

image

image

SQL延用了數學上的無序集合概念,遍曆時也不關注次序。但計算機隻能一步步地執行(暫先不考慮並行計算的情況),而遍曆集合時總會有個次序,充分利用這個次序就可以方便地表達更豐富的計算需求。

比如我們想從一個集合取出半數成員構成新集合。這看起來象是過濾運算,但過濾條件和集合成員本身並沒有關係,而是由遍曆成員時的次序號決定的。

隻有~寫法無法方便地描述出這種運算,這時候還需有個符號(標識符)來表示遍曆的次序號。

事實上,大部分高級語言在寫循環語句時都會有個循環變量來表示次序號。但許多集合化語言中並沒有提供這個機製,如果碰到這種運算就隻能再寫循環才能完成,如此就顯得很繁瑣。SQL也沒有表示遍曆次序後的方案,隻能先用子查詢人為製造一個序號出來,再針對這個序號進行過濾。

我們用#來表示遍曆的次序號,那麼這個運算就很容易寫了:

image

對應地,在過濾運算中我們總是返回滿足條件的成員,但有時候我們並不關心具體成員而隻關心成員的次序號,那麼我們還有必要設計返回次序號的過濾函數:

image

類似地,還可能有:

image

考慮到遍曆的次序時,我們還可以進一步豐富計算的描述能力。

比如有個問題是“12個月的銷售額數據已經按次序準備好,要計算哪些月份的增長率超過了5%”。

SQL很難寫這種跨行計算,所以需要用JOIN語句或窗口函數把上月數據和本月數據對齊,然後再來計算增長率,這不可避免地用到子查詢。

假設我們提供了相鄰成員的引用語法,就可以很容易描述這個計算了。

比如用[i]表示和當前成員距離為i的成員,再結合前述的#寫法,上麵的計算就可以寫成:

image

~[-1]表示前一個成員,也就是上月銷售額。找出把增長率超過5%的月份(也就是#),其它月份清0,最後選出這些非0的月份。

如果用上述的返回次序號的過濾函數,還可以寫成更簡單的形式:

image

除了相鄰成員外,還可能有相鄰集合的引用。比如還是上麵的集合,我們希望計算前後各一個月的銷售額移動平均值。

把[i]表達式擴展成[a,b]寫法來表示相鄰成員構成的集合,這個運算就很容易描述了:

image

相鄰集合還可能有更複雜的情況,比如計算到當月的累積銷售額。

允許[a,b]寫法中a缺省表示從第一個成員開始(對等地,b缺省可以理解為最後一個成員),這個運算可以寫成

image

同樣的,麵向結構化數據計算也還可以直接使用字段名,比如如果例子中的集合是由“月份”和“銷售額”的兩個字段構成的表,則上述的運算可以分別寫成:

image

考慮到有序遍曆時的語法規則就比常規遍曆要複雜許多,並且這些有序遍曆也是實際計算中經常發生的,如果遍曆語法不支持,會導致這些計算難以描述,程序員就要再編寫多行循環語句,繁瑣且影響可讀性。

SQL沒有提供有序遍曆的語法,經常需要使用子查詢和窗口函數來生成序號,某些複雜些的有序遍曆運算甚至寫不出來,所以需要用存儲過程手段轉換成多行循環語句才可以。從這個意義講,SQL雖然是集合化語言,但集合化不夠徹底。

image

清華大學計算機碩士,著有《非線性報表模型原理》等,1989年,中國首個國際奧林匹克數學競賽團體冠軍成員,個人金牌;2000年,創立潤乾公司;2004年,首次在潤乾報表中提出非線性報表模型,完美解決了中國式複雜報表製表難題,目前該模型已經成為報表行業的標準;2014年,經過7年開發,潤乾軟件發布不依賴關係代數模型的計算引擎——集算器,有效地提高了複雜結構化大數據計算的開發和運算效率;2015年,潤乾軟件被福布斯中文網站評為“2015福布斯中國非上市潛力企業100強”;2016年,榮獲中國電子信息產業發展研究院評選的“2016年中國軟件和信息服務業十大領軍人物”;2017年, 自主創新研發新一代的數據倉庫、雲數據庫等產品即將麵世。

image

《數據蔣堂》的作者蔣步星,從事信息係統建設和數據處理長達20多年的時間。他豐富的工程經驗與深厚的理論功底相互融合、創新思想與傳統觀念的相互碰撞,虛擬與現實的相互交織,產生出了一篇篇的瀝血之作。此連載的內容涉及從數據呈現、采集到加工計算再到存儲以及挖掘等各個方麵。大可觀數據世界之遠景、小可看技術疑難之細節。針對數據領域一些技術難點,站在研發人員的角度從淺入深,進行全方位、360度無死角深度剖析;對於一些業內觀點,站在技術人員角度闡述自己的思考和理解。蔣步星還會對大數據的發展,站在業內專家角度給予預測和推斷。靜下心來認真研讀你會發現,《數據蔣堂》的文章,有的會讓用戶避免重複前人走過的彎路,有的會讓攻城獅麵對紮心的難題茅塞頓開,有的會為初入行業的讀者提供一把開啟數據世界的鑰匙,有的甚至會讓業內專家大跌眼鏡,產生思想交鋒。

原文發布時間為:2017-09-15
本文作者:蔣步星
本文來自雲棲社區合作夥伴“數據派THU”,了解相關信息可以關注“數據派THU”微信公眾號

最後更新:2017-10-10 15:04:01

  上一篇:go  姚期智:算法將推動下一波AI浪潮,現有革新將達極限
  下一篇:go  獨家 | 一文讀懂優化算法