DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)

五、数据处理与 ETL 流程编程实现

5.1 数据抽取与转换(ETL)

在 DRG/DIP 2.0 时代的医院成本管理中,数据抽取与转换(ETL)是将医院各个业务系统中的原始数据转化为可供成本管理分析使用的关键环节。这一过程涉及从医院 HIS 系统中抽取患者诊疗数据,并对其进行格式转换、字段映射等处理,以满足后续成本核算和分析的需求。

医院 HIS 系统是医院信息化管理的核心,包含患者诊疗的全方位信息,如患者基本信息、诊疗记录、费用明细等。与 HIS 系统对接时,可采用 API 接口或中间库的方式进行数据抽取。使用 API 接口对接时,需先与 HIS 系统的开发团队沟通,获取详细的接口文档,明确接口的请求方式(如 GET、POST)、请求参数以及返回数据的格式(如 JSON、XML)。以获取患者诊疗信息为例,若 HIS 系统提供的 API 接口为https://his.example.com/api/patient_info,请求方式为 POST,请求参数为患者的住院号inpatient_no,则在 PostgreSQL 中可使用http_request函数(需安装相关扩展,如http_post)来发送请求,示例代码如下:

-- 安装http_post扩展(若未安装)CREATE EXTENSION IF NOT EXISTS http_post;-- 发送POST请求获取患者诊疗信息SELECT http_post('https://his.example.com/api/patient_info',    '{"inpatient_no": "20230101001"}',    'Content-Type: application/json');

上述代码通过http_post函数向 HIS 系统的 API 接口发送 POST 请求,传递患者住院号信息,接口返回的患者诊疗信息可进一步处理和存储到 PostgreSQL 数据库中。

采用中间库方式对接时,HIS 系统将数据定期同步到中间库(如 MySQL 数据库),PostgreSQL 再从中间库中抽取数据。可以使用dblink扩展来实现跨数据库连接和数据抽取。假设中间库为 MySQL,已安装mysql_fdw扩展并配置好连接参数,示例代码如下:

-- 安装mysql_fdw扩展(若未安装)CREATE EXTENSION IF NOT EXISTS mysql_fdw;-- 创建外部服务器CREATE SERVER his_mysql_server    FOREIGN DATA WRAPPER mysql_fdw    OPTIONS (host '192.168.1.100', port '3306', dbname 'his_database');-- 创建用户映射CREATE USER MAPPING FOR current_user    SERVER his_mysql_server    OPTIONS (username 'his_user', password 'his_password');-- 导入中间库中的患者诊疗信息表IMPORT FOREIGN SCHEMA his_schema    LIMIT TO (patient_info)    FROM SERVER his_mysql_server INTO public;

上述代码通过mysql_fdw扩展创建了与 MySQL 中间库的连接,导入了中间库中的患者诊疗信息表到 PostgreSQL 数据库中,以便后续进行数据处理。

从 HIS 系统抽取的数据往往需要进行格式转换和字段映射,以符合成本管理系统的数据模型。数据格式转换方面,日期格式可能在 HIS 系统中以不同的格式存储,如YYYY-MM-DDMM/DD/YYYY等,而成本管理系统要求统一的日期格式。在 PostgreSQL 中,可使用to_date函数进行日期格式转换,示例代码如下:

-- 将HIS系统中格式为MM/DD/YYYY的日期转换为YYYY-MM-DD格式UPDATE patient_infoSET admission_date = to_date(his_admission_date, 'MM/DD/YYYY')WHERE his_admission_date ~ '^\d{2}/\d{2}/\d{4}$';

字段映射是将 HIS 系统中的字段对应到成本管理系统中的字段。HIS 系统中的患者姓名字段可能为patient_name,而成本管理系统中为name,则可通过UPDATE语句进行字段映射,示例代码如下:

-- 字段映射,将HIS系统中的patient_name映射到成本管理系统中的nameUPDATE patient_infoSET name = his_patient_name;

在实际应用中,可能还需要处理复杂的数据结构,如 HIS 系统中可能将患者的多个诊断信息存储在一个字段中,以逗号分隔,而成本管理系统要求将每个诊断信息存储在单独的字段或数组中。可使用string_to_array函数将逗号分隔的诊断信息拆分为数组,示例代码如下:

-- 将HIS系统中逗号分隔的诊断信息拆分为数组UPDATE patient_infoSET diagnosis_array = string_to_array(his_diagnoses, ',');

通过以上数据抽取与转换的编程实现,能够将医院 HIS 系统中的原始数据转化为符合成本管理系统要求的数据格式和结构,为后续的成本核算、分析和管理提供准确、可靠的数据基础。

5.2 时间窗口处理与增量抽取

在医院成本管理系统中,数据的持续更新和增长是常态。为了减少系统负载,提高数据处理效率,按医保结算周期(如月度)进行增量抽取数据是一种行之有效的方法。这种方法能够避免每次都对全量数据进行处理,仅抽取自上次抽取时间点以来发生变化的数据,从而显著降低数据传输和处理的工作量。

在 PostgreSQL 中,实现时间窗口处理和增量抽取可以借助数据库的时间戳字段和相关的查询语句。假设患者诊疗信息表PatientInfo中有一个UpdateTime字段,记录了每条记录的最后更新时间。要实现每月的增量抽取,可以使用以下步骤和代码示例:

首先,确定时间窗口。以月度为例,获取当前月份的起始时间和结束时间。在 PostgreSQL 中,可以使用date_trunc函数和generate_series函数来生成时间窗口。获取当前月份的起始时间和结束时间的代码如下:

-- 获取当前月份的起始时间SELECT date_trunc('month', current_date) INTO start_date;-- 获取当前月份的结束时间SELECT (date_trunc('month', current_date) + INTERVAL '1 month - 1 day') INTO end_date;

上述代码中,date_trunc('month', current_date)函数将当前日期截断到月份,得到当前月份的起始时间,存储在start_date变量中。(date_trunc('month', current_date) + INTERVAL '1 month - 1 day')则是在当前月份起始时间的基础上加上 1 个月再减去 1 天,得到当前月份的结束时间,存储在end_date变量中。

接下来,根据时间窗口进行增量抽取。使用WHERE子句结合UpdateTime字段来筛选出在时间窗口内更新的记录。从PatientInfo表中抽取当前月份更新的患者诊疗信息的代码如下:

-- 从PatientInfo表中抽取当前月份更新的记录SELECT *FROM PatientInfoWHERE UpdateTime BETWEEN start_date AND end_date;

上述代码通过BETWEEN运算符,筛选出UpdateTime字段在start_dateend_date之间的记录,即当前月份更新的患者诊疗信息。

在实际应用中,还可以结合INSERT INTO...SELECT语句,将增量抽取的数据插入到另一个表中,用于后续的处理和分析。将当前月份更新的患者诊疗信息插入到MonthlyPatientInfo表中的代码如下:

-- 将当前月份更新的记录插入到MonthlyPatientInfo表中INSERT INTO MonthlyPatientInfoSELECT *FROM PatientInfoWHERE UpdateTime BETWEEN start_date AND end_date;

上述代码将从PatientInfo表中筛选出的当前月份更新的记录插入到MonthlyPatientInfo表中,方便对每月的增量数据进行单独处理和分析。

为了确保每次增量抽取的准确性和连续性,可以记录上次抽取的时间点。在每次抽取完成后,更新记录的时间点,以便下次抽取时能够准确获取自上次抽取以来的增量数据。可以使用一个单独的表来记录抽取时间点,假设该表名为ETLTimeStamp,包含TableName(表名)和LastExtractTime(上次抽取时间)字段。更新和获取抽取时间点的代码如下:

-- 更新ETLTimeStamp表中PatientInfo表的上次抽取时间为当前月份的结束时间UPDATE ETLTimeStampSET LastExtractTime = end_dateWHERE TableName = 'PatientInfo';-- 从ETLTimeStamp表中获取PatientInfo表的上次抽取时间SELECT LastExtractTimeFROM ETLTimeStampWHERE TableName = 'PatientInfo';

上述代码中,第一条UPDATE语句将ETLTimeStamp表中PatientInfo表的LastExtractTime更新为当前月份的结束时间,以便下次抽取时能够准确获取自上次抽取以来的增量数据。第二条SELECT语句则是从ETLTimeStamp表中获取PatientInfo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6305.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据缺失补全方法综述

数据缺失补全方法综述 摘要1. 引言2. 数据缺失的类型3. 数据缺失补全方法3.1 简单插补方法3.1.1 均值插补3.1.2 中位数插补3.1.3 众数插补3.1.4 前向填充和后向填充3.1.5 线性插值3.1.6 多重插补 3.2 基于模型的插补方法3.2.1 线性回归插补3.2.2 加权回归插补3.2.3 主成分分析&…

算法竞赛之离散化技巧 python

目录 离散化实战演练总结 离散化 不改变数据相对大小的情况下,对数据进行相应的下标映射,即离散化。 例如:【100,200,300,400,500】,离散化后为【1,2,3,4,5】 什么时候可以离散化:当数据只与它们之间的相对大小有关&a…

系统思考—业务协同

最近在和一些客户的沟通中,企业老板都提到一个共同的困惑:每个部门都感觉自己在解决问题,做了正确的事情,但为什么组织的绩效就是没有增长?更糟糕的是,大家都不知道问题到底出在哪里? 在这种情…

Git 详细安装教程以及gitlab添加SSH密钥

目录 一、下载安装 二、gitlab添加SSH密钥 一、下载安装 (1)去官网下载 找到下载的安装包双击进行安装。 (2)使用许可声明 双击下载后的 Git-2.47.1.2-64-bit.exe,开始安装,这个界面主要展示了 GPL 第…

编程题-两数相加(中等)

题目: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这…

电子应用设计方案103:智能家庭AI浴缸系统设计

智能家庭 AI 浴缸系统设计 一、引言 智能家庭 AI 浴缸系统旨在为用户提供更加舒适、便捷和个性化的沐浴体验,融合了人工智能技术和先进的水疗功能。 二、系统概述 1. 系统目标 - 实现水温、水位和水流的精确控制。 - 提供多种按摩模式和水疗功能。 - 具备智能清洁…

【MySQL】 库的操作

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 库的操作 发布时间:2025.1.23 隶属专栏:MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…

一位前端小白的2024总结

目录 简要 一、迷茫点的解决 (1)前端领域该怎么学? (2)旧技术还需要学吗? (3)我该学些什么? 二、折磨点的解决 (1)学技术成果回报太慢怎么…

kettle与Springboot的集成方法,完整支持大数据组件

目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL(提取、转换、加载)流程中,Kettle(Pentaho Data Integration, PDI)作为一种强大的开源ETL工具,被广泛应用于各种数据处理场景。…

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …

【2024年华为OD机试】 (C卷,200分)- 字符串拼接(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个字符列表&#xff08;字符范围为 a-z&#xff0c;且字符数量 M 满足 0 < M ≤ 30&#xff09;&#xff0c;从中选取字符&#xff08;每个字符只能使用一次&#xff09;拼接成长度为 N&#xff08;0 < N ≤ 5&#xff09;的字符串。要求拼…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

软件测试 —— 性能测试(jmeter)

软件测试 —— 性能测试&#xff08;jmeter&#xff09; 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman&#xff0c;我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具&#xff…

vs code为不同项目设置不同的背景图

vs code不同项目显示不同的背景图 效果展示 项目1-图 {"background.enabled": true, "background.interval": 0,"background.customImages": ["file:///C:/Users/Administrator/Pictures/bg.png"],"background.style": {&q…

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…

OpenStack基础架构

openstack是一套IaaS云的解决方案&#xff0c;是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术&#xff1a; 这么来看&#xff0c;3个物理机上产生10个虚拟机&#xff0c;所以把服务分散到10个虚拟机上和分散到4个虚拟…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

如何实现各种类型的进度条

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了浮动按钮相关的内容&#xff0c;,本章回中将介绍进度条相关的Widget,闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flu…

arcgis短整型变为长整型的处理方式

1.用QGIS的重构字段工具进行修改&#xff0c;亲测比arcgis的更改字段工具有用 2.更换低版本的arcgis10.2.2&#xff0c;亲测10.5和10.6都有这个毛病&#xff0c;虽然官方文档里面说的是10.6.1及以上 Arcgis10.2.2百度链接&#xff1a;https://pan.baidu.com/s/1HYTwgnBJsBug…