2017-10-20 283 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 /帮助/人,答案) –