2

私の設定では、StudyとActivity_Historyの2つのテーブルがあります。活動は研究で実行されるため、1:多くの関係があります。

Activity_HistoryテーブルでSQLクエリを実行できるようにしたいのですが、これにより、アクティビティと以前に実行されたアクティビティが取得されます。私は現在これを持っています:

SELECT 
        *
FROM Activity_History AS A1
LEFT JOIN Activity_History AS A2
ON A2.Parent_Study_ID =
(
    SELECT TOP 1 Parent_Study_ID
    FROM Activity_History AS A3
    WHERE A3.Parent_Study_ID = A1.Parent_Study_ID 
          AND A3.Activity_Date < A1.Activity_Date
    ORDER BY Activity_Date DESC
)

これは機能していません。何が起こっているのかというと、クエリのActivity_Dateパーティをプルしても効果はなく、すべての行の日付の降順で最初に一致するActivity_Dateを返すだけです。これは、サブクエリでwhereでActivity_Dateを使用しているために発生していると思いますが、これはサブクエリselectでは使用されていません。

助けてくれてありがとう!

4

2 に答える 2

3

SQL Serverを使用していると思いますか?もしそうなら、これはROW_NUMBER()を使用して機能するはずです:

WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Parent_Study_Id ORDER BY Activity_Date ) RN
    FROM Activity_History
    )
SELECT * 
FROM CTE T1
    LEFT JOIN CTE T2 ON T1.RN = T2.RN+1 AND T1.Parent_Study_Id  = T2.Parent_Study_Id 

そして、これがSQLFiddleです。

于 2013-02-20T18:17:56.963 に答える
0

SQLServer2005 +では、LEFTJOINの代わりにOUTERAPPLYを使用する必要があります

SELECT *
FROM Activity_History AS A1 OUTER APPLY ( 
                                         SELECT TOP 1 Parent_Study_ID
                                         FROM Activity_History AS A2
                                         WHERE A2.Parent_Study_ID = A1.Parent_Study_ID 
                                           AND A2.Activity_Date < A1.Activity_Date
                                         ORDER BY A2.Activity_Date DESC
                                         ) o
于 2013-02-20T18:55:51.623 に答える