2017-08-24 22 views
4

我身邊有一個網站,該網站有不同的店的部分,但是當用戶在年底檢查出來,我們只知道一些數據的記錄是通過尋找他們最什麼鋪段近期部分打SQL窗口堅持在給定的條件

例如,如果我有一個看起來像

session, hit_number, page 
a,1,homepage 
a,2,generic_page 
a,3,shoe_store, 
a,4,buy_add_basket 
a,5,buy_checkout 
b,1,sock_store 
b,2,shoe_store, 
b,3,buy_add_to_basket 
b,4,buy_checkout 
c,1,homepage 
c,2,sock_store 
c,3,sock_store 
c,4,buy_add_to_basket 
c,5,home_page 
c,6,shoe_store 
a,5,home_page 

我想堅持他們去(其中存在最後存儲數據僅供當他們在一買一節的網頁(即頁面名稱以「buy」開頭)

輸出我期待的是:

session, hit_number, page 
a,1,homepage,null 
a,2,generic_page,null 
a,3,shoe_store,null 
a,4,buy_add_basket,shoe_store 
a,5,buy_checkout,shoe_store 
b,1,sock_store,null 
b,2,shoe_store,null 
b,3,buy_add_to_basket,shoe_store 
b,4,buy_checkout,shoe_store 
c,1,homepage,null 
c,2,sock_store,null 
c,3,sock_store,null 
c,4,buy_add_to_basket,sock_store, 
c,5,home_page,null 
c,6,shoe_store,null 
a,5,home_page,null 
+0

呃......你可以這樣做。我都是進行分析,但應該誠實地不會在SQL中捕獲這些數據。您將遇到影響未來擴展的數據庫。您應該使用實時日誌監控應用程序。我全心全意爲正確的工作提供正確的工具。我不認爲我可以給出鏈接,但我對Splunk有所偏愛。您可以通過這種方式獲得更多的數據分析。就像比較頁面瀏覽到銷售..計劃的報告和實時儀表板...等... –

+0

@SteveKline這是一個關閉,我不需要使用splunk或監視任何東西。我只是做一次性分析 – shecode

+0

你在使用什麼供應商,例如SQL服務器,MySQL,Oracle,Postgres等......? – ttallierchio

回答

2

如果你的模式是這樣的:

create table weblog 
(session varchar(10) 
,hit_number int 
,page varchar(30) 
); 

INSERT INTO weblog VALUES 
('a',1,'homepage') 
,('a',2,'generic_page') 
,('a',3,'shoe_store') 
,('a',4,'buy_add_basket') 
,('a',5,'buy_checkout') 
,('b',1,'sock_store') 
,('b',2,'shoe_store') 
,('b',3,'buy_add_to_basket') 
,('b',4,'buy_checkout') 
,('c',1,'homepage') 
,('c',2,'sock_store') 
,('c',3,'sock_store') 
,('c',4,'buy_add_to_basket') 
,('c',5,'home_page') 
,('c',6,'shoe_store') 
,('a',5,'home_page'); 

那麼你一定要SELECT語句,如:

SELECT "session" 
, hit_number 
, page 
, CASE 
    WHEN page like 'buy%' THEN 
    max(CASE 
     WHEN page like '%store' THEN page 
     ELSE NULL 
     END) OVER (PARTITION BY session ORDER BY hit_number) 
    ELSE NULL 
    END as last_store 
FROM weblog; 

(這是postgres 9.6,哪個數據庫您使用的?)

順便說一句,我跟@ SteveKline的評論認爲,這似乎不是正確的方法。

3

我在SQL Server但查詢得到的結果在多數供應商合作,這樣做。其背後的邏輯是,檢查時page列包含'buy'然後拿到min值即上面對網頁名稱中包含'store'

創建和填充表中的一個:

DECLARE @table TABLE 
(
    session VARCHAR(1), 
    hit_number INT, 
    page  VARCHAR(50) 
); 
INSERT INTO @table VALUES 
('a',1,'homepage'), 
('a',2,'generic_page'), 
('a',3,'shoe_store'), 
('a',4,'buy_add_basket'), 
('a',5,'buy_checkout'), 
('b',1,'sock_store'), 
('b',2,'shoe_store'), 
('b',3,'buy_add_to_basket'), 
('b',4,'buy_checkout'), 
('c',1,'homepage'), 
('c',2,'sock_store'), 
('c',3,'sock_store'), 
('c',4,'buy_add_to_basket'), 
('c',5,'home_page'), 
('c',6,'shoe_store'), 
('a',5,'home_page'); 

Select * From @table將給予以下結果:

session hit_number page 
a  1   homepage 
a  2   generic_page 
a  3   shoe_store 
a  4   buy_add_basket 
a  5   buy_checkout 
b  1   sock_store 
b  2   shoe_store 
b  3   buy_add_to_basket 
b  4   buy_checkout 
c  1   homepage 
c  2   sock_store 
c  3   sock_store 
c  4   buy_add_to_basket 
c  5   home_page 
c  6   shoe_store 
a  5   home_page 

查詢:

SELECT 
    session, 
    hit_number, 
    page, 
    CASE 
     WHEN page LIKE 'buy%' 
     THEN MIN(CASE 
        WHEN page LIKE '%store' 
        THEN page 
        ELSE NULL 
       END) OVER(PARTITION BY session ORDER BY hit_number) 
     ELSE NULL 
    END AS previous_buy_page 
FROM @table; 

返回預期結果:

session hit_number page    previous_buy_page 
a  1   homepage   NULL 
a  2   generic_page  NULL 
a  3   shoe_store   NULL 
a  4   buy_add_basket  shoe_store 
a  5   buy_checkout  shoe_store 
a  5   home_page   NULL 
b  1   sock_store   NULL 
b  2   shoe_store   NULL 
b  3   buy_add_to_basket shoe_store 
b  4   buy_checkout  shoe_store 
c  1   homepage   NULL 
c  2   sock_store   NULL 
c  3   sock_store   NULL 
c  4   buy_add_to_basket sock_store 
c  5   home_page   NULL 
c  6   shoe_store   NULL 
1

據我瞭解,直到另一個頁面被訪問的「上次訪問商店頁面」應persistet或會話結束。我是在後端進行這種操作的朋友。圍繞add操作的觸發器或存儲過程應該能夠做到。特別是添加觸發器可能會起作用。但是你可以使用,是理想的選擇至極很大程度上取決於你所使用的DBMS(不是所有有兩個選項和性能可大不相同過同樣的支持)。

就我個人而言,我會在會話中堅持「上次訪問過的商店」,並將其添加到所有插入。我認爲在顯示錶2個觸發器可以這樣做:

,試圖更新會話方
  • 一個觸發「最後訪問的網頁」條目每次的東西被添加到該表。
  • 而且還有一個觸發器或存儲過程用於將會話的「last visited頁面」從會話傳輸到此表。

INSTEAD OF觸發器,你當然也可以使用所有包裝此存儲過程,但恕我直言觸發器是在這種情況下,清潔劑,因爲它不依賴於如何添加的數據。正常會話清理代碼也會處理清理臨時數據。而會話的默認值可以是「null」。您應該考慮在兩個觸發器代碼中都沒有會話(無論出於何種原因)的罕見事件。 當然這只是爲了將來添加它。它不會追溯適用於現有的表格。

如果您希望它適用於所有現有和將來的數據,視圖上的計算列將是我擁有的最佳創意。至少DBMS可以對這些緩存進行適當的緩存。但是它又取決於DBMS,以及它是否支持類似計算列的視圖。