成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第22期:有序遍歷語法

企業動態
遍歷可以說是最基本的集合運算了,本篇文章我們將接上篇文章繼續討論遍歷運算的語法規則。

 

【數據蔣堂】第22期:有序遍歷語法

 

接前一期 【數據蔣堂】第21期:常規遍歷語法

我們繼續討論遍歷運算的語法規則。

5. 序號的引用

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

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

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

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

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

  1. A.select(#<=A.len()/2)       取前一半成員 
  2. A.select(#%2==0)             取偶數位置的成員 

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

  1. A.pselect( ~>5 )              返回大于5的成員的次序號 

類似地,還可能有:

  1. A.pmax()                         返回***值的次序號 
  2. ... 

6. 相鄰成員和集合的引用

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

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

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

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

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

  1. A.(if(~/~[-1]>1.05,#,0)).select(~>0) 

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

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

  1. A.pselect(~/~[-1]>1.05) 

 

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

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

  1. A.(~[-1,1].avg()) 

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

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

  1. A.(~[,0].sum()) 

 

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

 

  1. A.select(銷售額/銷售額[-1]>1.05)                這里結果集中已有月份字段,不再需要用#了 
  2. A.derive(銷售額[-1,1].avg:移動平均值)        增加一個字段表示移動平均 
  3. A.derive(銷售額[,0].sum():累計銷售額) 

 

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

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-09-05 22:34:24

遍歷SQL運算

2017-10-09 22:33:56

SQL等值分組有序分組

2017-10-18 22:34:33

SQL等值分組有序分組

2017-12-26 15:33:24

JOINSQL運算

2018-01-10 15:25:43

JOIN維度SQL

2017-08-16 15:31:31

SQL語法集合化

2017-08-09 16:13:48

SQL大數據語法

2018-03-14 07:47:41

大數據語法SQL

2017-08-22 21:55:18

SQL語法離散性

2012-01-10 09:10:03

百度技術沙龍數據挖掘

2011-08-18 13:20:31

網絡安全技術周刊

2013-01-24 10:20:28

桌面運維

2009-11-17 15:07:16

PHP數組遍歷

2013-01-21 13:41:59

IBMdW

2016-05-18 14:34:34

2018-01-18 20:47:18

CPU數據線程

2018-01-24 07:45:51

數據倍增分段列存

2017-11-08 06:18:43

JOINSQL運算

2018-02-06 23:30:07

文件存儲數據

2017-05-25 08:56:22

硬盤性能特征
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人网在线观看 | 91在线中文字幕 | 亚洲欧美高清 | 9久久婷婷国产综合精品性色 | 成人无遮挡毛片免费看 | www午夜视频| 凹凸日日摸日日碰夜夜 | 日韩在线欧美 | 一区二区三区在线观看视频 | 精品国产一区二区三区久久 | 91免费入口| 日本免费小视频 | 国产精品久久久久久久免费观看 | 日韩在线视频一区 | 国产精品视频网 | 五月免费视频 | 99综合 | 日韩国产在线 | 四虎影音| 天天操夜夜骑 | 综合久久综合久久 | av国产精品| 精品1区 | 日韩在线中文字幕 | 国产亚洲一区在线 | a久久 | 99精品网| 日韩精品无码一区二区三区 | 一区二区三区四区国产 | 91 在线| 成人黄色电影在线播放 | 一区二区三区回区在观看免费视频 | 免费观看www7722午夜电影 | 日本黄色一级片视频 | 亚洲欧洲一区 | 欧美日韩久久久 | 久久久噜噜噜www成人网 | 81精品国产乱码久久久久久 | 自拍偷拍小视频 | 天天操精品视频 | 1000部精品久久久久久久久 |