Oracle SQL 循环遍历日期范围

2024-02-13

我正在尝试编写一个执行以下操作的查询:

  • 从 Visit 表中获取 Start_Date 和 End_Date
  • 对于日期范围内包含的每个日期,搜索遭遇表 查看特定提供者在该日期是否看过患者
  • 生成一个表格,显示每个日期以及谁在该日期见过该患者 日期。
  • Notes:
  • 患者可能在该日期没有见过,这应该导致 NULL 或类似的结果
  • 在某个日期可能有不止一位提供者看过患者,这会导致该日期有不止一条线路。

简化示例:
开始日期:2015 年 1 月 1 日
结束日期:2015 年 1 月 4 日

期望的输出:

╔══════╦══════════╦═══════╦═══════╗
║  ID  ║   DATE   ║ NAME  ║ TYPE  ║
╠══════╬══════════╬═══════╬═══════╣
║ 2222 ║ 1-Jan-15 ║ Smith ║ Note  ║
║ 2222 ║ 2-Jan-15 ║ Jones ║ Note  ║
║ 2222 ║ 2-Jan-15 ║ Smith ║ Order ║
║ 2222 ║ 3-Jan-15 ║ NULL  ║       ║
║ 2222 ║ 4-Jan-15 ║ Jones ║ Note  ║
╚══════╩══════════╩═══════╩═══════╝

这是我到目前为止所得到的。这会生成这些特定提供者何时见到患者的列表,但对于那些未见到患者的日期,它不会导致 NULL。

SELECT V.VISIT_ID, ET.ENCOUNTER_TRANSACTION_DATE, P.NAME_LAST, ETT.ENC_TRANS_TYPE_NAME
FROM VISIT V
RIGHT OUTER JOIN ENCOUNTER_TRANSACTION ET ON V.VISIT_ID = ET.VISIT_ID AND V.INSTITUTION_ID = ET.INSTITUTION_ID
INNER JOIN ENCOUNTER_TRANSACTION_TYPE ETT ON ET.ENCOUNTER_TYPE_ID = ETT.ENCOUNTER_TRANSACTION_TYPE_ID
INNER JOIN LOCAL_PROVIDER LP ON ET.ORDERING_PROVIDER_ID = LP.LOCAL_PROVIDER_ID
INNER JOIN PERSON_IDENTIFIER I ON I.IDENTIFIER = LP.PROVIDER_NUMBER AND I.IDENTIFIER_SYS_ID = LP.PROVIDER_NUMBER_SYS_ID  
INNER JOIN PERSON P ON P.PERSON_ID = I.PERSON_ID
WHERE
  V.INSTITUTION_ID = 1 AND
  V.END_DATE IS NOT NULL AND
  V.VOIDED_YN = 'N' AND
  V.CARE_SETTING_CODE = 'I' AND
  V.PATIENT_TEAM_ID IN (16, 17, 18) AND
  V.START_DATE >= (TRUNC(ADD_MONTHS(CURRENT_DATE, -1),'mon')) AND
  V.START_DATE <= (LAST_DAY(ADD_MONTHS(CURRENT_DATE, -1))) AND
  I.IDENTIFIER IN (
    '1234', --Smith
    '4321', --Jones
  )
ORDER BY V.VISIT_ID ASC, ET.ENCOUNTER_TRANSACTION_DATE ASC;

当前输出(缺少 2015 年 1 月 3 日的 NULL 行):

╔══════╦══════════╦═══════╦═══════╗
║  ID  ║   DATE   ║ NAME  ║ TYPE  ║
╠══════╬══════════╬═══════╬═══════╣
║ 2222 ║ 1-Jan-15 ║ Smith ║ Note  ║
║ 2222 ║ 2-Jan-15 ║ Jones ║ Note  ║
║ 2222 ║ 2-Jan-15 ║ Smith ║ Order ║
║ 2222 ║ 4-Jan-15 ║ Jones ║ Note  ║
╚══════╩══════════╩═══════╩═══════╝

以下是获取日期范围的方法:

 SELECT DATE'2015-01-01' + LEVEL - 1
   FROM dual
CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-02-01';

上面将获取2015年1月1日到2015年1月31日范围内的所有日期。

使用上述内容,您可以做的是插入开始日期和结束日期并创建 CTE,然后在日期上使用外部联接:

WITH dr AS (
    SELECT DATE'2015-01-01' + LEVEL - 1 AS transaction_date
      FROM dual
   CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-01-04'
)
SELECT V.VISIT_ID, dr.transaction_date
     , P.NAME_LAST, ETT.ENC_TRANS_TYPE_NAME
...
       ENCOUNTER_TRANSACTION ET RIGHT JOIN dr
    ON ET.ENCOUNTER_TRANSACTION_DATE = dr.transaction_date

UPDATE我花了一些时间,我想我明白了如何将上述内容集成到您的查询中。我确实没有 SQL Fiddle 的示例数据(无论如何你都有很多表)。您可以从这里开始,这应该获得所有适当的访问以及访问日期范围内的每个日期(假设没有访问超过 30 天 - 相应调整):

WITH dr AS (
    SELECT LEVEL AS dd FROM dual
   CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
     , p.name_last, ett.enc_trans_type_name
  FROM visit v CROSS JOIN dr
 WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
   AND v.institution_id = 1
   AND v.end_date IS NOT NULL
   AND v.voided_yn = 'N'
   AND v.care_setting_code = 'I'
   AND v.patient_team_id IN (16,17,18)
   AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
   AND v.end_date < TRUNC(CURRENT_DATE, 'MONTH');

那么我认为你的外连接应该是从那里开始的 LEFT JOIN(至少,如果我理解正确的话,我可能不会:

WITH dr AS (
    SELECT LEVEL AS dd FROM dual
   CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
  FROM visit v CROSS JOIN dr
  LEFT JOIN encounter_transaction et
    ON v.visit_id = et.visit_id
   AND v.institution_id = et.institution_id
   AND TRUNC(v.start_date - 1 + dr.dd) = et.encounter_transaction_date
  LEFT JOIN encounter_transaction_type ETT
    ON et.encounter_type_id = ett.encounter_transaction_type_id
  LEFT JOIN local_provider lp
    ON et.ordering_provider_id = lp.local_provider_id
  LEFT JOIN person_identifier i
    ON i.identifier = lp.provider_number
   AND i.identifier_sys_id = lp.provider_number_sys_id
   AND i.identifier IN (
       '1234', --Smith
       '4321' --Jones ** you had an extra comma here!
)
  LEFT JOIN person p
    ON p.person_id = i.person_id
 WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
   AND v.institution_id = 1
   AND v.end_date IS NOT NULL
   AND v.voided_yn = 'N'
   AND v.care_setting_code = 'I'
   AND v.patient_team_id IN (16,17,18)
   AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
   AND v.start_date < TRUNC(CURRENT_DATE, 'MONTH');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle SQL 循环遍历日期范围 的相关文章

  • SQL查询查找具有特定数量关联的行

    使用 Postgres 我有一个架构conversations and conversationUsers Each conversation有很多conversationUsers 我希望能够找到具有确切指定数量的对话conversati
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • php基于onclick函数输入日期类型

    用户选择日期 月份和年份 然后按一个按钮 根据他选择的日期向他显示数据库的值 不知道代码问题出在哪里
  • 如果 Oracle SQL 中存在视图,则删除视图[重复]

    这个问题在这里已经有答案了 我是 Oracle 数据库系统的新手 Oracle 12c 中以下 SQL 语句的等效项是什么 DROP VIEW IF EXIST
  • 如何创建没有循环关系的树形表?

    CREATE TABLE TREE node1 id UUID REFERENCES nodes object id NOT NULL node2 id UUID REFERENCES nodes object id NOT NULL CO
  • SQL:如何从一个表中获取另一个表中每一行的随机行数

    我有两个数据不相关的表 对于表 A 中的每一行 我想要例如表 B 中的 3 个随机行 使用光标这相当容易 但速度非常慢 那么我该如何用单个语句来表达这一点以避免 RBAR 呢 要获得 0 到 N 1 之间的随机数 可以使用 abs chec
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • 如何使用 ADO 连接字符串以 SYS 身份连接到 Oracle 数据库?

    我正在尝试这个 Provider MSDASQL 1 Persist Security Info False User ID sys Password pwd Initial Catalog DATABASE Data Source Odb
  • 如何使用 SQL Server 2008 执行多个 CASE WHEN 条件?

    我想做的是对同一列使用多个 CASE WHEN 条件 这是我的查询代码 SELECT Url p ArtNo p Description p Specification CASE WHEN 1 1 or 1 1 THEN 1 ELSE 0
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 如何将今天的日期返回到 Oracle 中的变量

    我想做这个 DECLARE today as smalldatetime SELECT today GetDate 但我需要一个oracle翻译 甲骨文使用SYSDATE 还有 ANSI 标准CURRENT TIMESTAMP 除其他外 S
  • 随着时间的推移累积(不重叠)——技术?

    我正在尝试找到一种更好的方法来制作水晶报告 其他人的 按组添加不重叠的时间 这显然是一个古老的问题 有没有一种技术可以得到 调整每条记录的 开始 结束 时间 以消除共同 重叠时间 亚组内 使用直接 SQL 尽管我发现我可以执行 CTE 假设
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr
  • 如何在 SQL Server 2012 中选择除一列之外的所有列? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以选择所有列 但只选择我不想选择的特定列 我的意思是有时我会遇到这样的问题 表有数百个字段 而我只需要删除一个字段 我需要重写所有列吗 有什么窍门吗 喜欢select
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu

随机推荐

  • 计算 3D 网格的体积

    我厌倦了计算 3D 物体 立方体 圆柱体 的体积 有人可以帮忙吗 有这个问题吗 问题是 如何计算物体的体积 基于三角形的坐标 我的班级做得不好 有人能帮我吗 提高班级水平 thanks public class Algorithm priv
  • 我可以在我的应用程序中同时使用 GCM 和 FCM 吗?

    我有一个Android项目 其中实现了GCM 后端 服务器 已经使用 GCM 进行了适当的编码 现在是否可以在我的项目中添加 firebase FCM 并与 GCM 并行工作 我无法迁移到 FCM 因为不可能更改我的后端代码 因为它是一个大
  • 如何在react-native项目中启用jsconfig.json

    我正在设置一个新的 React Native 项目 并希望通过将 jsconfig json 文件添加到项目的根目录来配置应用程序以支持使用绝对路径导入模块 但该应用程序无法解析这些模块 我需要做一些额外的设置吗 我使用react nati
  • 如何将后代 UrlHelper 类注入 WebViewPage 以启用缓存清除?

    我已经覆盖了UrlHelper Content 方法 现在我希望使用我的实现而不是默认的UrlHelper class 如何配置 MVC 来告诉它要注入哪个类WebViewPage Url财产 更新1 这个想法很简单 捆绑包通过向 url
  • PageObject with Ruby - 在文本字段中设置文本仅适用于主文件

    我正在自动化一个网站 该网站有一个页面 其中包含通过单选按钮选择的选项列表 当选择其中一个无线电时 会出现一个文本字段和一个选择列表 我创建了一个文件 test contracting rb 通过它我执行测试 ruby test contr
  • 将数组广播为不同的形状(添加“假”维度)

    在 python 中 使用 numpy 我可以将数组广播为不同的形状 gt gt gt import numpy as np gt gt gt a np array 2 3 4 gt gt gt b np zeros 3 2 gt gt g
  • 将 XmlSerializer 与根元素中的数组一起使用

    我有一个类似于以下内容的 XML 文档
  • 停止“开发人员工具访问需要控制另一个进程才能继续调试”警报

    我最近升级到10 7 3 当我登录后第一次尝试在模拟器中调试我的iOS项目时 系统提示我以下两个警报 我的用户是管理员用户 我以前从未见过这些警报 我怎样才能让他们停下来 EDIT 我已确认我是该组织的会员 developer小组使用id
  • NSWindow在showWindow后自动关闭

    我正在尝试在情节提要中打开 NSWindow 我已正确实例化控制器 窗口打开但立即消失 var sb NSStoryboard var vc NSWindowController IBAction func openWindow sende
  • 识别美丽汤中令人困惑的价值目标

    这是一个涉及Python的问题 美丽的汤 https www crummy com software BeautifulSoup bs4 doc 和 HTML 以及投资百科API https github com kirkthaker in
  • 洪水填充四路算法复杂度

    我已经搜索过 但似乎找不到洪水填充算法 四路版本 的复杂性 大 O 表示法的复杂度究竟是多少 时间复杂度为 O 4 mn mn 因为矩阵的每个单元最多被处理4次 例如 可以通过其顶部 底部 左侧或右侧单元格来调用特定单元格
  • OpenCV 绘制匹配错误

    我的代码由一个部分组成 我在其中对一组匹配进行排序并根据距离定义良好的匹配 当我尝试绘制匹配时 我收到错误 OpenCV Error Assertion failed i1 gt 0 i1 lt static cast
  • 如何使 pip 可用于 Windows 上的 git bash 命令行?

    我添加了pip我的 python site packages 目录中的安装文件夹到我的 PATH 但我仍然只能通过以下方式运行它python m pip在我的 git bash 中 只是pip给我command not found 我环顾四
  • PyQt5 - 如何在鼠标点击位置画一个点?

    我试图在主窗口上画一个点 但该点未显示 我尝试过绑定mousePressEvent to paintEvent 但效果不佳 这是我的代码的当前版本 也不起作用 我也尝试提出一个观点drawPoint方法 它也不起作用 import sys
  • Django - 如何从模型中选择特定列?

    我嗅了一下 找不到这个 但我确信它就在这里的某个地方 对这个潜在的双重帖子表示歉意 如果我有这个代码 return Story objects filter user request user id order by create date
  • Python 在 cv2.destroyWindow() 之后冻结

    我在 Mac OS X Lion 上的 Python 2 7 下使用 openCV 每当我运行代码来简单地显示相机源 来自 iSight 时 Python 就会冻结 看起来相机实际上并没有得到清理 我使用了相同代码的多个不同版本 如下 来自
  • Android EditText,在 numberDecimal 输入类型的情况下显示逗号和点作为可能的分隔符

    我需要让用户在输入十进制数时在两个变体之间进行选择 使用逗号 作为分隔符 使用点 作为分隔符 默认情况下 如果我使用inputType numberDecimal in the EditTextxml配置 EditText仅显示数字和逗号
  • R - 更改 corrplot 轴标签的大小

    我正在使用以下内容corrplot require corrplot needs the corrplot package corrplot cor lpp axis1 lpp axis2 method c number bg grey10
  • 如何将我的函数放入类中。Beginner

    我下面有一个 Json 函数 需要构造一个具有两个函数的类 我的第二个函数如何 知道 data这是第一个函数的响应 def results json request request get json data json loads json
  • Oracle SQL 循环遍历日期范围

    我正在尝试编写一个执行以下操作的查询 从 Visit 表中获取 Start Date 和 End Date 对于日期范围内包含的每个日期 搜索遭遇表 查看特定提供者在该日期是否看过患者 生成一个表格 显示每个日期以及谁在该日期见过该患者 日