2

我的设置是我有两个表,Study 和 Activity_History。活动以研究为基础,因此存在 1:many 关系。

我希望能够在 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,但这不在子查询选择中。

谢谢你的帮助!

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 

这是SQL Fiddle

于 2013-02-20T18:17:56.963 回答
0

在 SQLServer2005+ 而不是 LEFT JOIN 您需要使用OUTER APPLY

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 回答