亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > PostgreSQL > 正文

介紹PostgreSQL中的Lateral類型

2020-10-29 21:49:46
字體:
來源:轉載
供稿:網友

PostgreSQL 9.3 用了一種新的聯合類型! Lateral聯合的推出比較低調,但它實現了之前需要使用編寫程序才能獲得的強大的新查詢. 在本文中, 我將會介紹一個在 PostgreSQL 9.2 不可能被實現的渠道轉換分析.
什么是 LATERAL 聯合?

對此的最佳描述在文檔中 可選 FROM 語句清單 的底部:

LATERAL 關鍵詞可以在前綴一個 SELECT FROM 子項. 這能讓 SELECT 子項在FROM項出現之前就引用到FROM項中的列. (沒有 LATERAL 的話, 每一個 SELECT 子項彼此都是獨立的,因此不能夠對其它的 FROM 項進行交叉引用.)

當一個 FROM 項包含 LATERAL 交叉引用的時候,查詢的計算過程如下: 對于FROM像提供給交叉引用列的每一行,或者多個FROM像提供給引用列的行的集合, LATERAL 項都會使用行或者行的集合的列值來進行計算. 計算出來的結果集像往常一樣被加入到聯合查詢之中. 這一過程會在列的來源表的行或者行的集合上重復進行.

這種計算有一點密集。你可以比較松散的將 LATERAL 聯合理解作一個 SQL 的foreach 選擇, 在這個循環中 PostgreSQL 將循環一個結果集中的每一行,并將那一行作為參數來執行一次子查詢的計算.

我們可以用這個來干些什么?

看看下面這個用來記錄點擊事件的表結構:
 

CREATE TABLE event (  user_id BIGINT,  event_id BIGINT,  time BIGINT NOT NULL,  data JSON NOT NULL,  PRIMARY KEY (user_id, event_id))

每一個事件都關聯了一個用戶,擁有一個ID,一個時間戳,還有一個帶有事件屬性的JSON blob. 在堆中,這些屬性可能包含一次點擊的DOM層級, 窗口的標題,會話引用等等信息.

加入我們要優化我們的登錄頁面以增加注冊. 第一步就是要計算看看我們的哪個渠道轉換上正在丟失用戶.

2015421170911413.png (1246×794)

示例:一個注冊流程的個步驟之間的渠道轉換率.


假設我們已經在前端配備的裝置,來沿著這一流程來記錄事件日志,所有的數據都會保存到上述的事件數據表中.[1] 最開始的問題是,我們要計算有多少人查看了我們的主頁,而他們之中有百分之多少在那次查看了主頁之后的兩個星期之內輸入了驗證信息. 如果我們使用 PostgreSQL 較老的版本, 我們可能需要使用PL/pgSQL這一PostgreSQL內置的過程語言 來編寫一些定制的函數. 而在 9.3 中, 我們就可以使用一個 lateral 聯合,只用一個搞笑的查詢就能計算出結果,不需要任何擴展或者 PL/pgSQL.

 

SELECTuser_id,view_homepage,view_homepage_time,enter_credit_card,enter_credit_card_timeFROM (-- Get the first time each user viewed the homepage.SELECTuser_id,1 AS view_homepage,min(time) AS view_homepage_timeFROM eventWHEREdata->>'type' = 'view_homepage'GROUP BY user_id) e1 LEFT JOIN LATERAL (-- For each row, get the first time the user_id did the enter_credit_card-- event, if one exists within two weeks of view_homepage_time.SELECT1 AS enter_credit_card,time AS enter_credit_card_timeFROM eventWHEREuser_id = e1.user_id ANDdata->>'type' = 'enter_credit_card' ANDtime BETWEEN view_homepage_time AND (view_homepage_time + 1000*60*60*24*14)ORDER BY timeLIMIT 1) e2 ON true

沒有人會喜歡30多行的SQL查詢,所以讓我們將這些SQL分成片段來分析。第一塊是一段普通的 SQL:
 

SELECT  user_id,  1 AS view_homepage,  min(time) AS view_homepage_timeFROM eventWHERE  data->>'type' = 'view_homepage'GROUP BY user_id

也就是要獲取到每個用戶最開始觸發 view_homepage 事件的時間. 然后我們的 lateral 聯合就可以讓我們迭代結果集的每一行,并會在接下來執行一次參數化的子查詢. 這就等同于針對結果集的每一行都要執行一邊下面的這個查詢:
 

SELECT  1 AS enter_credit_card,  time AS enter_credit_card_timeFROM eventWHERE  user_id = e1.user_id AND  data->>'type' = 'enter_credit_card' AND  time BETWEEN view_homepage_time AND (view_homepage_time + 1000*60*60*24*14)ORDER BY timeLIMIT 1

例如,對于每一個用戶,要獲取他們在觸發 view_homepage_time 事件后的兩星期內觸發 enter_credit_card  事件的時間. 因為這是一個lateral聯合,我們的子查詢就可以從之前的子查詢出引用到 view_homepage_time 結果集. 否則,子查詢就只能單獨執行,而沒辦法訪問到另外一個子查詢所計算出來的結果集.

之后哦我們整個封裝成一個select,它會返回像下面這樣的東西:

user_id | view_homepage | view_homepage_time | enter_credit_card | enter_credit_card_time---------+---------------+--------------------+-------------------+------------------------567 | 1 | 5234567890 | 1 | 5839367890234 | 1 | 2234567890 | |345 | 1 | 3234567890 | |456 | 1 | 4234567890 | |678 | 1 | 6234567890 | |123 | 1 | 1234567890 | |... 


因為這是一個左聯合,所以查詢結果集中會有不匹配 enter_credit_card 事件的行,只要有 view_homepage 事件就行. 如果我們匯總所有的數值列,就會得到渠道轉換的一個清晰匯總:
 

SELECT  sum(view_homepage) AS viewed_homepage,  sum(enter_credit_card) AS entered_credit_cardFROM (  -- Get the first time each user viewed the homepage.  SELECT  user_id,  1 AS view_homepage,  min(time) AS view_homepage_time  FROM event  WHERE  data->>'type' = 'view_homepage'  GROUP BY user_id) e1 LEFT JOIN LATERAL (  -- For each (user_id, view_homepage_time) tuple, get the first time that  -- user did the enter_credit_card event, if one exists within two weeks.  SELECT  1 AS enter_credit_card,  time AS enter_credit_card_time  FROM event  WHERE  user_id = e1.user_id AND  data->>'type' = 'enter_credit_card' AND  time BETWEEN view_homepage_time AND (view_homepage_time + 1000*60*60*24*14)  ORDER BY time  LIMIT 1) e2 ON true

… 它會輸出:

 viewed_homepage | entered_credit_card-----------------+---------------------827 | 10


我們可以向這個渠道中填入帶有更多lateral聯合的中間步驟,來得到流程中我們需要重點改進的部分. 讓我們在查看主頁和輸入驗證信息之間加入對使用示例步驟的查詢.
 

SELECT  sum(view_homepage) AS viewed_homepage,  sum(use_demo) AS use_demo,  sum(enter_credit_card) AS entered_credit_cardFROM (  -- Get the first time each user viewed the homepage.  SELECT  user_id,  1 AS view_homepage,  min(time) AS view_homepage_time  FROM event  WHERE  data->>'type' = 'view_homepage'  GROUP BY user_id) e1 LEFT JOIN LATERAL (  -- For each row, get the first time the user_id did the use_demo  -- event, if one exists within one week of view_homepage_time.  SELECT  user_id,  1 AS use_demo,  time AS use_demo_time  FROM event  WHERE  user_id = e1.user_id AND  data->>'type' = 'use_demo' AND  time BETWEEN view_homepage_time AND (view_homepage_time + 1000*60*60*24*7)  ORDER BY time  LIMIT 1) e2 ON true LEFT JOIN LATERAL (  -- For each row, get the first time the user_id did the enter_credit_card  -- event, if one exists within one week of use_demo_time.  SELECT  1 AS enter_credit_card,  time AS enter_credit_card_time  FROM event  WHERE  user_id = e2.user_id AND  data->>'type' = 'enter_credit_card' AND  time BETWEEN use_demo_time AND (use_demo_time + 1000*60*60*24*7)  ORDER BY time  LIMIT 1) e3 ON true

這樣就會輸出:

 viewed_homepage | use_demo | entered_credit_card-----------------+----------+---------------------827 | 220 | 86 


從查看主頁到一周之內使用demo,再到一周以內向其輸入信用卡信息,這就向我們提供了三個步驟的通道轉換. 從此,功能強大的 PostgreSQL 使得我們可以深入分析這些數據結果集,并對我們的網站性能進行整體的分析. 接著我們可能會有下面這些問題要解決:

  •     使用demo是否能增加注冊的可能性?
  •     通過廣告找到我們主頁的用戶是否同來自其他渠道的用戶擁有相同的轉換率?
  •     轉換率會跟隨不同的 A/B 測試變量發生怎樣的變化?

這些問題的答案會直接影響到產品的改進,它們可以從 PostgreSQL 數據庫中找到答案,因為現在它支持 lateral 聯合.


沒有 lateral 聯合,我們就只能借助 PL/pgSQL 來做這些分析。或者,如果我們的數據集很小,我們可能就不會碰這些復雜、低效的查詢. 在一項探索性數據研究使用場景下,你可能只是將數據從 PostgreSQL 里面抽取出來,并使用你所選擇的腳本語言來對其進行分析。但是其實還存在更強大的理由來用SQL表述這些問題, 特別是如果你正想要把整個全封裝到一套易于理解的UI中,并向非技術型用戶發布功能 的時候.

注意這些查詢可以被優化,以變得更加高效. 在本例中,如果我們在 (user_id, (data->>'type'), time)上創建一個btree索引, 我們只用一次索引查找就能針對每一個用戶計算每一個渠道步驟. 如果你使用的是SSD,在上面做查找花費是很小的,那這就足夠了。而如果不是,你就可能需要用稍微不同的手段來圖示化你的數據,詳細的內容我會留到另外一篇文章之中進行介紹.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美在线观看| 国产精选久久久久久| 91精品久久久久久久| 日本成人免费在线| 国产精品免费在线免费| 久久久亚洲国产| 亚洲美女视频网站| 日韩欧美在线观看视频| 亚洲аv电影天堂网| 成人www视频在线观看| 97**国产露脸精品国产| 日韩欧美精品网址| 亚洲人成电影在线| 韩国视频理论视频久久| 亚洲伊人第一页| 欧美成人一二三| 国产一区二区三区在线观看视频| 欧美巨乳美女视频| 性色av一区二区三区免费| 精品久久在线播放| 国产精品国产福利国产秒拍| www.亚洲人.com| 国产成人在线播放| 欧美黄色片在线观看| 日韩av影院在线观看| 91美女片黄在线观看游戏| 一区二区在线免费视频| 色噜噜狠狠狠综合曰曰曰88av| 亚洲91精品在线观看| 久久久av网站| 欧洲亚洲妇女av| 日韩在线免费av| 久久久久久久久久久久av| 在线看福利67194| 国产欧美精品一区二区三区介绍| 亚洲福利视频二区| 91精品国产综合久久久久久久久| 日韩精品中文在线观看| 欧美一级淫片videoshd| 精品视频久久久久久| 亚洲欧洲日本专区| 国产精品人成电影在线观看| 久久久精品影院| 国产精品人成电影在线观看| 亚洲精品丝袜日韩| 欧美日韩国产在线看| 日韩av电影在线免费播放| 亚洲国产91精品在线观看| 欧美精品电影免费在线观看| 亚洲午夜精品久久久久久久久久久久| 国产欧美日韩综合精品| 亚洲影影院av| 国产精品三级久久久久久电影| 久久久亚洲天堂| 久久久久久久久国产精品| 青草青草久热精品视频在线网站| 欧美国产日韩一区| 日日骚av一区| 国产在线观看一区二区三区| 中文字幕日韩视频| 亚洲无限乱码一二三四麻| 久久精品国产免费观看| 欧美性猛交xxxx乱大交| 亚洲国产精品一区二区久| 国产精品午夜一区二区欲梦| 日本一区二区在线免费播放| 欧美最猛性xxxxx亚洲精品| 亚洲成色www8888| 亚洲乱码一区av黑人高潮| www.亚洲免费视频| 久久亚洲精品国产亚洲老地址| 日韩欧美在线视频免费观看| 一夜七次郎国产精品亚洲| 国产精品久久视频| 国产精品美女主播在线观看纯欲| 日韩精品在线免费| 亚洲男女自偷自拍图片另类| 亚洲福利视频二区| 欧美壮男野外gaytube| 日韩中文在线视频| 黑人巨大精品欧美一区二区| 亚洲专区国产精品| 欧美国产在线视频| 亚洲区bt下载| 国产日韩欧美夫妻视频在线观看| 亚洲性夜色噜噜噜7777| 亚洲精品国产精品自产a区红杏吧| 国产精品欧美激情在线播放| 亚洲成人激情视频| 欧美性视频网站| 国产欧美欧洲在线观看| 91精品国产成人| 亚洲伦理中文字幕| 国产精品久久色| 国产999在线观看| 亚洲视频在线免费看| 大荫蒂欧美视频另类xxxx| 亚洲电影在线观看| 4k岛国日韩精品**专区| 日韩精品在线免费播放| www.欧美三级电影.com| 国产精品网红直播| 中文字幕亚洲综合久久| 国产精品一区二区久久| 日韩小视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 亚洲天堂av高清| 欧美日韩性视频| 亚洲男人天堂久| 日韩中文综合网| 国产精品视频一| 夜夜狂射影院欧美极品| 国产成人中文字幕| 51色欧美片视频在线观看| 欧美不卡视频一区发布| 欧美在线观看日本一区| 国产精品黄色影片导航在线观看| 狠狠躁夜夜躁人人爽超碰91| 一区国产精品视频| 日韩天堂在线视频| 国产精品久久久久久久天堂| 欧美中文在线字幕| 国产精品福利网站| 成人国产亚洲精品a区天堂华泰| 国产精品精品久久久久久| 国产成人精品免费久久久久| 欧美国产一区二区三区| 亚洲欧洲黄色网| 亚洲精品第一国产综合精品| 美日韩精品视频免费看| 精品久久久香蕉免费精品视频| 69视频在线播放| 美日韩精品免费观看视频| 456国产精品| 日韩欧美在线看| 欧美激情va永久在线播放| 亚洲精品91美女久久久久久久| 日韩美女激情视频| 国产美女被下药99| 欧美极品欧美精品欧美视频| 人人爽久久涩噜噜噜网站| 98精品国产高清在线xxxx天堂| 欧美成人一二三| 夜夜嗨av一区二区三区四区| 日韩av在线天堂网| 亚洲aⅴ日韩av电影在线观看| 亚洲xxxxx性| 亚洲一区中文字幕| 欧美性色视频在线| 国产视频精品一区二区三区| 国产一区二区三区在线播放免费观看| www.xxxx精品| 亚洲精品自在久久| 国产精品久久9| 精品国产999| 亚洲精品电影网在线观看| 4388成人网| 亚洲春色另类小说| 欧美性猛交xxxx免费看久久久| 亚洲999一在线观看www| 成人午夜在线影院| 国产91久久婷婷一区二区| 久久精品国产欧美激情| 日韩最新av在线|