SQL选择最近日期(W /三表连接)
使用下面的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)
我建议减少会话表,每个只有一行来了用户名并在该过程中派生想要的日期。这意味着在你可以简单地加入的地方引入一个子查询。下面有一个选项,使用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
您的问题现在解决了吗?你仍然有关于这个答案的问题吗?要接受答案“[**点击Tick **](https://ibb.co/ikqyO6)”以获取更多信息,请参阅[help/accepting](https:// *。COM /帮助/人,答案) –
我会尝试删除所有的GROUP BY元素,看看它是否会运行。把元素拿出来,当你有一些工作的时候,把它们一个接一个地加回去。 –
哪个dbms?如果我们将答案发布到错误的dbms中,那就没用了。 – Eric
你的第一个查询有什么问题?看起来没问题。你是否试图在没有'ORDER BY'的情况下运行它? – Eric