SQL 查询 - 返回连接表的前两条记录的连接

2024-03-07

我有两张桌子:

Patient

  • pk患者ID
  • Surname

患者状态

  • pkPatientStatusId
  • fk患者 ID
  • 状态码
  • 开始日期
  • EndDate

Patient -> 患者状态是一对多的关系。

我想知道是否可以在 SQL 中进行连接,只返回每个患者的前两个​​ PatientStatus 记录。如果仅存在一条 PatientStatus 记录,则不应在结果中返回该记录。

我的查询的正常连接是:

SELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientId
ORDER BY ps.fkPatientId, ps.StartDate

如果您使用 SQL Server 2005 或更高版本,CTE 可能是您的最佳选择,但如果您想要与其他平台更兼容的东西,这应该可行:

SELECT
     P.pkPatientID,
     P.FirstName,
     P.LastName,
     PS1.StatusCode AS FirstStatusCode,
     PS1.StartDate AS FirstStatusStartDate,
     PS1.EndDate AS FirstStatusEndDate,
     PS2.StatusCode AS SecondStatusCode,
     PS2.StartDate AS SecondStatusStartDate,
     PS2.EndDate AS SecondStatusEndDate
FROM
     Patient P
INNER JOIN PatientStatus PS1 ON
     PS1.fkPatientID = P.pkPatientID
INNER JOIN PatientStatus PS2 ON
     PS2.fkPatientID = P.pkPatientID AND
     PS2.StartDate > PS1.StartDate
LEFT OUTER JOIN PatientStatus PS3 ON
     PS3.fkPatientID = P.pkPatientID AND
     PS3.StartDate < PS1.StartDate
LEFT OUTER JOIN PatientStatus PS4 ON
     PS4.fkPatientID = P.pkPatientID AND
     PS4.StartDate > PS1.StartDate AND
     PS4.StartDate < PS2.StartDate
WHERE
     PS3.pkPatientStatusID IS NULL AND
     PS4.pkPatientStatusID IS NULL

对我来说,您想要前两种状态而不是后两种状态确实有点奇怪,但我假设您知道自己想要什么。

如果您能获得更好的性能,您还可以使用 WHERE NOT EXISTS 代替 PS3 和 PS4 连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 查询 - 返回连接表的前两条记录的连接 的相关文章

  • 如何搜索包含表情符号的文本?

    我们有一个 MySQL InnoDB 表 带有一个文本字段COLLATE utf8mb4 unicode ci 我需要搜索包含任何表情符号字符的行 我搜索了相当多的问题 但人们似乎有一个他们正在搜索的表情符号列表 我实际上正在寻找一种可以找
  • C# 中的多个 SQL 查询将变量作为列返回

    我正在开展一个创建注册系统的学校项目 我选择的数据库方法是使用 T SQL 因为它是我已经熟悉的东西 我正在使用下面的代码来查询数据库 public void button3 Click object sender EventArgs e
  • SQL 中的模糊分组

    我需要修改 SQL 表以对稍微不匹配的名称进行分组 并为组中的所有元素分配标准化名称 例如 如果初始表如下所示 Name Jon Q John Q Jonn Q Mary W Marie W Matt H 我想创建一个新表或向现有表添加一个
  • 为什么Mysql在连接另一个表B时对表A使用全表扫描?

    我有一个表 A 和一个表 B 我正在从表 A 中选择信息 其中我只需要表 A 中的信息 其中表 B 联接表 A 我在联合列和 WHERE 子句上有索引 这是选择代码 SELECT FROM tableA INNER JOIN tableB
  • R 中的 sqlSave 创建数据帧并将其保存到 SQL 表

    您好 我正在使用 R 将数据框保存到 DB2 SQL 表中 我似乎能够创建表骨架 但无法将数据附加到表中 gt df lt read csv dat csv 其中 dat csv 是没有标题的 csv 只有两列中的原始数据 然后我创建表 g
  • 我怎样才能从表中获得第一个免费ID

    我有一个带有主键字段 ID 的表 我不想使用身份 因为我需要为用户提供手动为新对象选择 ID 的可能性 所以我的想法是 默认情况下 在编辑视图中 ID 字段将为 0 如果用户不更改它 我需要找到第一个免费ID并使用它 如果用户更改 ID 我
  • 您能否推荐一个 JQuery 插件来组成一组可映射到 SQL 查询的条件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我发现了http redquerybuilder appspot com http redquerybu
  • 在准备好的语句中设置数组,抛出 java.sql.SQLFeatureNotSupportedException

    我有一个字符串列表 我想将其设置为准备好的语句中的参数 这里的问题和答案看起来很简单 如何使用数组列表作为准备好的语句参数 https stackoverflow com questions 17842211 how to use an a
  • EntityFramework 6 AddOrUpdate 不适用于复合或复合主键

    这个问题是我周末的噩梦 我有一张桌子AddOrUpdate无法正常工作 它不断添加但从不更新 我想做的就是当我使用以下命令将新实体添加到表中时AddOrUpdate我想要它检查AppointmentId and CompletionCode
  • SQL Server:多行的 SUM() 包括 where 子句

    我有一张如下所示的表 PropertyID Amount Type EndDate 1 100 RENT null 1 50 WATER null 1 60 ELEC null 1 10 OTHER null 2 70 RENT
  • T-sql:获取列的总和

    我有一张如下所示的表 W1 W2 w3 Gold 10 2 3 Silver 3 1 1 但我需要一个结果 W1 W2 w3 Gold 10 12 15 Silver 3 4 5 有什么方法可以得到这个结果吗 Mysql查询 SELECT
  • SQL 查询返回按周、月和年分组的记录。没有记录的周数应返回 0

    给出以下数据 ID CreatedDate ID1 2014 06 04 01 40 56 880 ID8 2014 06 05 00 27 02 403 ID6 2014 06 04 01 51 47 060 ID7 2014 06 05
  • 查找分区内最大的连续数字组

    我有以下按player id 和match date 排序的数据 我想找出连续运行次数最多的记录组 从2014 04 03到2014 04 12连续3次运行4次 player id match date runs 1 2014 04 01
  • Android 上的查询何时返回 Null?

    我似乎没有找到任何有关查询 插入或任何其他返回 null 的 SQL 方法的信息 但如果发生错误 它就会发生 我只是想知道游标为空是否意味着发生了错误 或者是否意味着没有选择任何行 例如 我不知道应该如何对待它 作为一个错误或可能不时发生的
  • BigQuery 中的 EXP() 返回浮点错误

    我有以下查询 SELECT EXP col FROM project dataset tablename Where col is FLOAT 但是 我收到此错误 Error Floating point error in function
  • 发生错误:“无法调用 nvarchar 上的方法。”

    我编写了一个查询来查找与特定问题相关的答案 但在运行此代码时收到此错误 无法调用 nvarchar 上的方法 select Posts Id as Answer ParentId as question User DisplayName a
  • 在SSIS中导入已合并单元格的Excel

    我的问题是在读取合并 组合列单元格的 Excel 文件时 例如 将下面的excel数据读取到数据库中 Excel 输入 ID NAME DEPT FNAME LNAME 1 Akil Tiwari IT 2 Vinod Rathore IT
  • CommandBehavior.SequentialAccess 是否有任何性能提升?

    我意识到我总是按照索引返回的顺序读取字段 使用常量 所以据我所知 我的代码已经与 CommandBehavior SequentialAccess 兼容 如果我打开它会有什么好处吗 DataReader 已经是只向前 只读 这才是真正的性能
  • 递归 CTE 中的 TSQL GROUP BY

    是否有解决方法可以在循环 CTE 内使用 GROUP BY 或者有解决方法 我需要对 CTE 表的结果集进行分组 并在具有相同 CTE 的另一个循环中使用它 但出现以下错误 不允许使用 GROUP BY HAVING 或聚合函数 递归公用表
  • Athena date_parse 用于具有可选毫秒字段的日期

    我在 S3 中有日期 使用它创建了 Athena 表 我在 S3 中有一些 json 格式的日期条目 在运行查询时 Athena 不接受这些条目作为日期或时间戳 使用 AWS Athena 它使用 Prestodb 作为查询引擎 示例 js

随机推荐