2017-10-20 14 views
0

以下のSQLクエリを使用しています。Interactive_Sessions.Sessiondateから最新のセッション日付を取得しようとしていますが、他の2つのテーブル(Interactive.Users & Patroninfo)以下は、このSQL最新の日付を選択する(W/3テーブル結合)

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エラーが表示されるということですが、私は、テーブル名が完全に一致を確認しました。

私は声明で、グループを削除すると、私は通常

BYグループで解決するでしょうORA-00937ない単一グループのグループ機能は、そこに誰もが似たような経験している取得しますか?この種のエラーを解決するための手口はありますか、あるいは私は密であり、何かが明らかに欠けていますか?

は、代わりに私はこれを試してみましたが、それは唯一のANY 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'要素を削除して実行するかどうかを確認します。要素を取り除いて、機能しているものがあれば、それを1つずつ追加して戻します。 –

+0

どのdbms?間違ったdbmsに回答を投稿すると無駄です。 – Eric

+0

最初のクエリで何が問題になっていますか?それは大丈夫と思われる。 'ORDER BY 'なしで実行しようとしましたか? – Eric

答えて

0

私はにつき1行のみにセッションテーブルを削減することを提案するための最も最近のInteractive_Sessions.Sessiondateを思い付きますユーザーIDを取得し、そのプロセスで必要な日付を取得します。これは、単純な結合があったところでサブクエリを導入することを意味します。下には、ROW_NUMBER()を使用して値1を(最新の)日付に(降順で並べ替えることによって)供給する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 
; 

第2のアプローチは、あなたの現在のクエリのためには十分であるが、両方のアプローチを知っておくと便利です。 GROUP BYアプローチを使用すると(たとえば)、row_number()アプローチではできなかったCOUNT(*)を使用してセッション数を取得することもできます。しかし、セッションテーブルから、「最新の日付」と同じ行にある列がさらに必要な場合は、row_number()アプローチを使用します。

ORA-00904関連クエリについてこのような列エイリアスを使用する場合は、次のようにorder句でその列エイリアスを使用できます。ORDER BY MAX_SESS_DT

+0

あなたの質問は今解決されましたか?あなたはまだこの答えについて質問がありますか? [help/accepting](https:// stackoverflow。)を参照するには、「[** Click The Tick **](https://ibb.co/ikqyO6)」という回答を受け入れる。com/help/someone-answers) –

関連する問題