2017-08-08 40 views
0

我正在處理舊的數據庫,並且必須基於舊數據庫創建新列。這是一個日誌表,每一行都是一個事件。因此uid是一個用戶ID,用戶可以進行多個驗證請求。用加入或分組的SQL請求回到時間

這裏是我的表

event_id uid  event 
1   1  REQUEST 
2   1  VALIDATION 
3   2  REQUEST 
4   3  REQUEST 
5   3  VALIDATION 
6   2  VALIDATION 
7   1  REQUEST 
8   1  VALIDATION 

這裏想什麼,我有

event_id uid  event  last_event_id request_nb  
1   1   REQUEST  8    1 
2   1   VALIDATION 8    1 
3   2   REQUEST  6    1 
4   3   REQUEST  5    1 
5   3   VALIDATION 5    1 
6   2   VALIDATION 6    1 
7   1   REQUEST  8    2 
8   1   VALIDATION 8    2 

我認爲我需要一個uidgroup by,像1 + SUM(CASE WHEN EVENT = 'VALIDATION' THEN 1 ELSE 0 END) AS request_nb的總和。 last_event_idMAX。但我不熟悉這種連接。

這裏是我的樣本數據集:

CREATE TABLE IF NOT EXISTS `docs` (
    `event_id` int(6) unsigned NOT NULL, 
    `uid` int(3) unsigned NOT NULL, 
    `event` varchar(200) NOT NULL, 
    PRIMARY KEY (`event_id`) 
) DEFAULT CHARSET=utf8; 
INSERT INTO `docs` (`event_id`, `uid`, `event`) VALUES 
    ('1', '1', 'REQUEST'), 
    ('2', '1', 'VALIDATION'), 
    ('3', '2', 'REQUEST'), 
    ('4', '3', 'REQUEST'), 
    ('5', '3', 'VALIDATION'), 
    ('6', '2', 'VALIDATION'), 
    ('7', '1', 'REQUEST'), 
    ('8', '1', 'VALIDATION'); 

和同小提琴:http://sqlfiddle.com/#!9/404dcf/1

有沒有人有一個想法?

謝謝!

+1

標籤與正在使用的數據庫你的問題。 –

回答

1

例如爲:

SELECT a.event_id 
    , a.uid 
    , a.event 
    , a.i 
    , b.last_event_id 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev_uid = uid THEN CASE WHEN @prev_event = event THEN @i:[email protected]+1 ELSE @i:=1 END ELSE @i:=1 END i 
      , @prev_uid := uid prev_uid 
      , @prev_event := event prev_event FROM docs x 
      , (SELECT @prev_uid := null, @prev_event := null, @i:=1) vars 
     ORDER 
      BY uid 
      , event 
      , event_id 
    ) a 
    JOIN 
    (SELECT uid, MAX(event_id) last_event_id FROM docs GROUP BY uid) b 
    ON b.uid = a.uid 
    ORDER 
    BY a.event_id; 
+0

非常感謝! 你會如何製作'last_event_id'列? 謝謝 –

+0

@RobinFourcade來吧。這不是火箭科學。 – Strawberry

+0

非常感謝!我知道得到結果並不難,但是因爲我有一張很大的桌子,所以我只想擁有一個'優化'的解決方案!所以再一次,非常感謝您的全面答覆! :) –

1

您可以使用ANSI標準的窗函數:

select t.*, 
     max(event_id) over (partition by uid) as last_event_id, 
     row_number() over (partition by uid, event order by event_id) as request_nb 
from t; 
+0

謝謝,但首先我有以下錯誤:'驗證失敗:查詢失敗:您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'(分區由uid)'作爲last_event_id,row_number()over(分區由uid,在第2行)附近使用正確的語法' 並且一個uid可以有多個'request_nb' (在我的例子中爲uid 1)是你的請求正在做什麼? 謝謝! –

+0

這裏是一個小提琴:http://sqlfiddle.com/#!9/d9ed6/7 –

+0

看來,MySql不處理OVER –