2

ユーザーが2種類のテストを完了できるシステムがあります。DISTINCT最新のテスト完了日でソートされたユーザーのリストを取得する必要があります。

この目的のために、表は次のように設定することもできます。

Test_Users
 - Test_User_Id (int)

Test_1_Results
 - Test_1_Result_Id (int)
 - Test_User_Id (int)
 - Date_Of_Completion (datetime)

Test_2_Results
 - Test_2_Result_Id (int)
 - Test_User_Id (int)
 - Date_Of_Completion (datetime)

次のようにTest_User_Id使用して、すべての異なるのリストを喜んで取得できます。UNION

SELECT Test_User_Id FROM Test_1_Results
UNION
SELECT Test_User_Id FROM Test_2_Results

そして、これらのテーブルの1つからの結果を、を使用して簡単に並べ替えることができましたORDER BY Date_Of_Completion DESCが、またはを使用してこれを行う方法がわかりませんUNION

最終的には、このクエリを次のような他のクエリにラップできるようにしたいと思います。

SELECT *
FROM Test_Users
WHERE Test_User_Id IN (
    //The query i am asking about
)
WHERE some_criteria

しかし、これまでのところ、aを使用しているときにこれを行うことがUNIONできず、何が間違っているのかわかりません。

私がこれを行おうとしている理由は、管理者ユーザーがテストを完了したすべての人のリストを表示できる必要があるためです。最後に完了したものが一番上に表示されます。

私はSQLにかなり精通していますが、これまで実際にUNION演算子を使用する必要はありませんでした。

4

4 に答える 4

1

元の質問に対する ejb_guy の回答が気に入っています。質問が拡張され、各ユーザーの最新の結果のテスト タイプと結果 ID も知りたい場合は、次の方法で (テストされていませんが) うまくいくと思いますが、非常に効率的です。

with All_Tests as (
  select Test_User_Id,
         Date_Of_Completion,
         'Test1' as Test_Type,
         Test_1_Result_Id as Result_Id
    from Test_1_Results
  union all
  select Test_User_Id,
         Date_Of_Completion,
         'Test2' as Test_Type,
         Test_2_Result_Id as Result_Id
    from Test_2_Results
),
Ranked_Tests as (
  select rank() over( partition by Test_User_Id
                      order by Date_Of_Completion desc,
                               Test_Type,
                               Result_Id
                    ) as Test_Rank,
         Test_User_Id,
         Date_Of_Completion,
         Test_Type,
         Result_Id
    from All_Tests
)
select Test_User_Id,
       Date_Of_Completion,
       Test_Type,
       Result_Id
  from Ranked_Tests
 where Test_Rank=1
 order by Date_Of_Completion desc, Test_User_Id
于 2012-06-05T14:50:42.440 に答える