sql - 在 SQL 子查询中使用多列

标签 sql sql-server

我的设置是有两个表:Study 和 Activity_History。事件以研究为基础,因此存在一对多的关系。

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

感谢您的帮助!

最佳答案

我假设您使用的是 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 .

关于sql - 在 SQL 子查询中使用多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987043/

相关文章:

mysql - 从已选择的表中选择数据

SQL Server 删除所有超过 10 分钟的行

java - 在 IntelliJ IDEA 中创建数据库

sql - 参数化 SQL IN 子句

java.sql.SQLException : Internal error when parsing callable statement metadata (missing parameter type) 异常

sql - 我的SQL要求用户之前已成功登录一次,我该如何修改以删除该要求?

sql-server - 跨两列创建异或约束

sql-server - 将所有 PK 和 FK GUID 列和关系转换为 int 的最快方法是什么?

java - 将 JDBC 连接到 Sql Server 2012 时出现 SSLv3 错误?

sql-server - SQL - 为 DISTINCT 记录分配唯一 ID