2013-05-28 104 views
2

我是新來MYSQL,我有我的SQL已裝箱的腳本,需要該腳本轉換爲MySQL的腳本:轉換SQL腳本的MySQL腳本

;WITH cte (id, ApplicationName, ActivityDate, username) AS 
(
    SELECT 
      id 
     , ApplicationName 
     , ActivityDate 
     , ROW_NUMBER() OVER (PARTITION BY ApplicationName ORDER BY ActivityDate) username 
    FROM #temp 
    WHERE ApplicationName IN ('Login', 'Logout') 
) 
SELECT * 
FROM #temp O 
INNER JOIN (
    SELECT 
      A1.id [IID] 
     , A2.id [OID] 
     , A2.ActivityDate 
    FROM cte A1 
    INNER JOIN cte A2 ON A1.username = A2.username 
     AND A1.ApplicationName = 'Login' 
     AND A2.ApplicationName = 'logout' 
) Logout ON Logout.[IID] < O.id AND Logout.[OID] > o.id 
WHERE NOT O.ApplicationName IN ('Login', 'Logout') 
ORDER BY O.id 

#temp表的代碼:

CREATE TABLE #temp (
     id INT IDENTITY (1, 1) 
    , ActivityName VARCHAR(MAX) 
    , ApplicationName VARCHAR(100) 
    , ActivityDate DATETIME 
    , UserName VARCHAR(20) 
) 

INSERT INTO #temp 
    VALUES ('Successfully Login into Dynamic Portal Application', 'Login', '2013-05-20 13:22:21', 'kk'), 
    ('Login Success into Liferay SAMl Application', 'Liferay SAMl Application', '2013-05-21 15:28:08', 'kk'), 
    ('Login Success into Zoho SAMl Application', 'Zoho SAMl Application', '2013-05-21 15:28:08', 'kk'), 
    ('Login Success into Intranet Non SAMl Application', 'Intranet Non SAMl Application', '2013-05-23 13:04:22', 'kk'), 
    ('Logout Successfully from application', 'Logout', '2013-05-21 18:20:07', 'kk'), 
    ('Successfully Login into Dynamic Portal Application', 'Login', '2013-05-20 14:22:21', 'kk'), 
    ('Login Success into Liferay SAMl Application', 'Liferay SAMl Application', '2013-05-21 16:28:08', 'kk'), 
    ('Login Success into Zoho SAMl Application', 'Zoho SAMl Application', '2013-05-21 16:29:08', 'kk'), 
    ('Login Success into Intranet Non SAMl Application', 'Intranet Non SAMl Application', '2013-05-21 15:04:22', 'kk'), 
    ('Logout Successfully from application', 'Logout', '2013-05-21 19:20:07', 'kk') 

所需的輸出:活動

ActivityName     LoginTime   LogOutTime 
Liferay SAMl Application  2013-05-21 15:28:08 2013-05-21 18:20:07 
Zoho SAMl Application   2013-05-21 15:28:08 2013-05-21 18:20:07 
Intranet Non SAMl Application 2013-05-23 13:04:22 2013-05-21 18:20:07 
Liferay SAMl Application  2013-05-21 16:28:08 2013-05-21 19:20:07 
Zoho SAMl Application   2013-05-21 16:29:08 2013-05-21 19:20:07 
Intranet Non SAMl Application 2013-05-21 15:04:22 2013-05-21 19:20:07 

退出時間將應用程序的退出時間.. ..

+1

請提供#temp表中的一些示例數據。 – Devart

+0

這個腳本實際上做了什麼?我天真的SQL – diEcho

+0

我只是我還是其他人想知道「Zoho SAMl」是什麼? –

回答

4

嘗試這一個 -

查詢:

CREATE TABLE temp (
    ID int AUTO_INCREMENT PRIMARY KEY, 
    ActivityName varchar(500), 
    ApplicationName varchar(100), 
    ActivityDate datetime, 
    UserName varchar(20) 
); 

INSERT INTO temp (ActivityName, ApplicationName, ActivityDate, UserName) 
    VALUES ('Successfully Login into Dynamic Portal Application', 'Login', '2013-05-20 13:22:21', 'kk'), 
    ('Login Success into Liferay SAMl Application', 'Liferay SAMl Application', '2013-05-21 15:28:08', 'kk'), 
    ('Login Success into Zoho SAMl Application', 'Zoho SAMl Application', '2013-05-21 15:28:08', 'kk'), 
    ('Login Success into Intranet Non SAMl Application', 'Intranet Non SAMl Application', '2013-05-23 13:04:22', 'kk'), 
    ('Logout Successfully from application', 'Logout', '2013-05-21 18:20:07', 'kk'), 
    ('Successfully Login into Dynamic Portal Application', 'Login', '2013-05-20 14:22:21', 'kk10'), 
    ('Login Success into Liferay SAMl Application', 'Liferay SAMl Application', '2013-05-21 16:28:08', 'kk10'), 
    ('Login Success into Zoho SAMl Application', 'Zoho SAMl Application', '2013-05-21 16:29:08', 'kk10'), 
    ('Login Success into Intranet Non SAMl Application', 'Intranet Non SAMl Application', '2013-05-21 15:04:22', 'kk10'), 
    ('Logout Successfully from application', 'Logout', '2013-05-21 19:20:07', 'kk10'); 

SELECT t_.ApplicationName, t_.ActivityDate, t2_.ActivityDate 
FROM temp t_ 
JOIN (
    SELECT 
      MAX(CASE WHEN t.ApplicationName = 'Login' THEN t.ID END) AS IID 
     , MAX(CASE WHEN t.ApplicationName = 'Logout' THEN t.ID END) AS OID 
     , MAX(t.ActivityDate) AS ActivityDate 
    FROM temp t 
    WHERE t.ApplicationName IN ('Login', 'Logout') 
    GROUP BY t.UserName 
) t2_ ON t2_.IID < t_.ID AND t2_.OID > t_.ID 
WHERE t_.ApplicationName NOT IN ('Login', 'Logout') 
ORDER BY t_.ID 

輸出:

ApplicationName     ActivityDate   ActivityDate 
------------------------------- ----------------------- ----------------------- 
Liferay SAMl Application  2013-05-21 15:28:08.000 2013-05-21 18:20:07.000 
Zoho SAMl Application   2013-05-21 15:28:08.000 2013-05-21 18:20:07.000 
Intranet Non SAMl Application 2013-05-23 13:04:22.000 2013-05-21 18:20:07.000 
Liferay SAMl Application  2013-05-21 16:28:08.000 2013-05-21 19:20:07.000 
Zoho SAMl Application   2013-05-21 16:29:08.000 2013-05-21 19:20:07.000 
Intranet Non SAMl Application 2013-05-21 15:04:22.000 2013-05-21 19:20:07.000 

更新:

SELECT t_.ApplicationName, t_.ActivityDate, t2_.ActivityDate 
FROM temp t_ 
JOIN (
    SELECT 
      d1.ID AS IID 
     , d2.ID AS OID 
     , d2.ActivityDate 
     , d2.UserName 
    FROM ( 
     SELECT 
       id 
      , l.UserName 
      , @curRow := @curRow + 1 AS row_number 
     FROM temp l 
     JOIN (SELECT @curRow := 0) r 
     WHERE ApplicationName = 'Login' 
    ) d1 
    JOIN (
     SELECT 
       id 
      , ActivityDate 
      , l.UserName 
      , @curRow2 := @curRow2 + 1 AS row_number 
     FROM temp l 
     JOIN (SELECT @curRow2 := 0) r 
     WHERE ApplicationName = 'Logout' 
    ) d2 ON d1.row_number = d2.row_number AND d1.UserName = d2.UserName 
) t2_ ON t2_.IID < t_.ID AND t2_.OID > t_.ID AND t_.UserName = t2_.UserName 
WHERE t_.ApplicationName NOT IN ('Login', 'Logout') 
ORDER BY t_.ID 
+0

請嘗試更新的答案。 – Devart

+0

Devart此腳本無法正常工作,就像同一用戶不止一次登錄一樣,那麼它只顯示不同應用程序的單個條目,因爲您在查詢中使用了max ... –

+1

@Kapil Singh,對於您提供的數據作爲一個例子,我寫了一個最佳查詢。請更改輸入數據並更正您的問題。而在未來,請尊重人們的時間。 – Devart