2017-10-20 171 views
0

使用下面的SQL查詢我試圖從Interactive_Sessions.Sessiondate中檢索最近會話日期,同時還從另外兩個表(Interactive.Users & Patroninfo)顯示信息使用連接SQL選擇最近日期(W /三表連接)

東西會喜歡這個

JDOE  Jane  DOE 1234  [email protected]  10/27/14 10:24 
JDOA  Jane  DOA 1345  [email protected]  11/13/17 12:34 

下面就是我目前與我的工作確保瞭如何解決嘗試執行時收到錯誤。這些是我在MAX中遺漏的東西嗎?

Select 
     INTERACTIVE_USERS.USERID, PATRONINFO.FIRSTNAME, PATRONINFO.LASTNAME, 
     PATRONINFO.PATRONID, INTERACTIVE_USERS.EMAIL, 
     MAX(INTERACTIVE_SESSIONS.SESSIONDATE) 
FROM 
     INTERACTIVE_SESSIONS 
JOIN 
     INTERACTIVE_USERS 
ON 
     INTERACTIVE_SESSIONS.USERID = INTERACTIVE_USERS.USERID 
JOIN 
     PATRONINFO 
ON 
     INTERACTIVE_USERS.PID = PATRONINFO.PATRONID 
GROUP 
     BY INTERACTIVE_USERS.USERID, PATRONINFO.FIRSTNAME, PATRONINFO.LASTNAME, PATRONINFO.PATRONID, INTERACTIVE_USERS.EMAIL 
ORDER BY 
     MAX(INTERACTIVE_SESSIONS.SESSIONDATE) 

我的問題是,當我在一組由離開我的語句收到無效的ORA-00904錯誤,但是我已經驗證表名完全匹配。

當我刪除集團通過聲明我得到ORA-00937不是一個單一的組羣功能,我通常會用一個組解決BY

有沒有人在那裏遇到過類似的東西嗎?是否有任何技巧來解決這種錯誤,或我是密集的,錯過了明顯的東西?

另外我也試過,但它僅與最近Interactive_Sessions.Sessiondate爲任何Interactive_Users.Userid,而不是每個Interactive_Users.Userid

Select 
    INTERACTIVE_USERS.USERID, PATRONINFO.FIRSTNAME, PATRONINFO.LASTNAME, 
    PATRONINFO.PATRONID, INTERACTIVE_USERS.EMAIL, 
    INTERACTIVE_SESSIONS.SESSIONDATE 
FROM 
    INTERACTIVE_SESSIONS 
JOIN 
    INTERACTIVE_USERS 
ON 
    INTERACTIVE_SESSIONS.USERID = INTERACTIVE_USERS.USERID 
JOIN 
    PATRONINFO 
ON 
    INTERACTIVE_USERS.PID = PATRONINFO.PATRONID 
WHERE 
    interactive_sessions.sessiondate=(Select 
    MAX(Interactive_sessions.sessiondate) from Interactive_sessions) 
+0

我會嘗試刪除所有的GROUP BY元素,看看它是否會運行。把元素拿出來,當你有一些工作的時候,把它們一個接一個地加回去。 –

+0

哪個dbms?如果我們將答案發布到錯誤的dbms中,那就沒用了。 – Eric

+0

你的第一個查詢有什麼問題?看起來沒問題。你是否試圖在沒有'ORDER BY'的情況下運行它? – Eric

回答

0

我建議減少會話表,每個只有一行來了用戶名並在該過程中派生想要的日期。這意味着在你可以簡單地加入的地方引入一個子查詢。下面有一個選項,使用ROW_NUMBER()爲「最新」日期提供值1(按降序排列)。

SELECT 
     INTERACTIVE_USERS.USERID 
    , PATRONINFO.FIRSTNAME 
    , PATRONINFO.LASTNAME 
    , PATRONINFO.PATRONID 
    , INTERACTIVE_USERS.EMAIL 
    , IESSIONS.SESSIONDATE 
FROM INTERACTIVE_USERS 
JOIN PATRONINFO ON INTERACTIVE_USERS.PID = PATRONINFO.PATRONID 
JOIN (
     SELECT USERID, SESSIONDATE 
      , row_number() over(partition by USERID, order by SESSIONDATE DESC) rn 
     FROM INTERACTIVE_SESSIONS 
    ) ISESSIONS ON INTERACTIVE_USERS.USERID = ISESSIONS.USERID 
       AND ISESSIONS.RN = 1 
ORDER BY IESSIONS.SESSIONDATE 
; 

或者,在子查詢,而不是使用GROUP BY(這是一個更傳統的方法):

SELECT 
     INTERACTIVE_USERS.USERID 
    , PATRONINFO.FIRSTNAME 
    , PATRONINFO.LASTNAME 
    , PATRONINFO.PATRONID 
    , INTERACTIVE_USERS.EMAIL 
    , IESSIONS.SESSIONDATE 
FROM INTERACTIVE_USERS 
JOIN PATRONINFO ON INTERACTIVE_USERS.PID = PATRONINFO.PATRONID 
JOIN (
     SELECT USERID, MAX(SESSIONDATE) SESSIONDATE 
     FROM INTERACTIVE_SESSIONS 
     GROUP BY USERID 
    ) ISESSIONS ON INTERACTIVE_USERS.USERID = ISESSIONS.USERID 
ORDER BY IESSIONS.SESSIONDATE 
; 

第二種方法是足以滿足您當前的查詢,但它是有用的知道這兩種方法。使用GROUP BY方法(例如),您還可以使用COUNT(*)獲取不能在row_number()方法中執行的會話數。但是,如果您需要來自會話表中與「最新日期」位於同一行的更多列,那麼row_number()方法將啓用該列。

關於ORA-00904相關查詢。如果您使用像這樣的列別名MAX(INTERACTIVE_SESSIONS.SESSIONDATE) AS MAX_SESS_DT那麼你可以在訂單子句中使用該列別名:ORDER BY MAX_SESS_DT

+0

您的問題現在解決了嗎?你仍然有關於這個答案的問題嗎?要接受答案「[**點擊Tick **](https://ibb.co/ikqyO6)」以獲取更多信息,請參閱[help/accepting](https:// stackoverflow。COM /幫助/人,答案) –