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

news2025/1/24 11:23:50

五、数据处理与 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_info

SET 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映射到成本管理系统中的name

UPDATE patient_info

SET name = his_patient_name;

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

-- 将HIS系统中逗号分隔的诊断信息拆分为数组

UPDATE patient_info

SET 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 PatientInfo

WHERE UpdateTime BETWEEN start_date AND end_date;

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

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

-- 将当前月份更新的记录插入到MonthlyPatientInfo表中

INSERT INTO MonthlyPatientInfo

SELECT *

FROM PatientInfo

WHERE UpdateTime BETWEEN start_date AND end_date;

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

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

-- 更新ETLTimeStamp表中PatientInfo表的上次抽取时间为当前月份的结束时间

UPDATE ETLTimeStamp

SET LastExtractTime = end_date

WHERE TableName = 'PatientInfo';

-- 从ETLTimeStamp表中获取PatientInfo表的上次抽取时间

SELECT LastExtractTime

FROM ETLTimeStamp

WHERE TableName = 'PatientInfo';

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【玩转全栈】----YOLO8训练自己的模型并应用

继上篇: 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了,接下来我将为大家介绍如何训练自己的特定模型,并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…

Caesar

Caesar 打开.txt: oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} 根据题目判断是凯撒密码,flag前头是cyberpeace{},可以得到偏移量是12. 所以: cyberpeace{you_have_learned_caesar_encryption} 下面是我找的关于凯撒密码的解密脚本 c…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…

纯css实现div宽度可调整

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>纯css实现div尺寸可调整</title><style…

Cesium特效——城市白模的科技动效的各种效果

最终效果图如下&#xff1a; 实现方法&#xff1a; 步骤一&#xff1a;使用cesiumlib生产白模&#xff0c;格式为3dtiles 注意事项&#xff1a;采用其他方式可能导致白模贴地&#xff0c;从而导致不能实现该效果&#xff0c;例如把步骤二的服务地址改为Cesium Sandcastle 里的…

JavaWeb 学习笔记 XML 和 Json 篇 | 020

今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽&#xff0c;我是菜鸟阿康。 以下是我的学习笔记&#xff0c;既做打卡也做分享&#xff0c;希望对你也有所帮助…

【力扣:新动计划,编程入门 —— 题解 ②】

—— 25.1.23 1512. 好数对的数目 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1,1,3] 输出&#xff1a;4 解释&#xff…

如何在data.table中处理缺失值

&#x1f4ca;&#x1f4bb;【R语言进阶】轻松搞定缺失值&#xff0c;让数据清洗更高效&#xff01; &#x1f44b; 大家好呀&#xff01;今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值&#xff0c;并且提供了一个自定义函数calculate_missing_va…

《RWA全球产业白皮书》发布:向凌云教授解析全球经济转型与RWA的未来

2025年1月16日&#xff0c;旅美经济学家、全球新兴产业金融专家向凌云教授在美国发布了引人注目的《RWA全球产业白皮书》。该白皮书通过深入分析全球产业结构变化&#xff0c;尤其强调了“真实世界资产”&#xff08;Real-World Assets&#xff0c;简称RWA&#xff09;在当前及…

TOGAF之架构标准规范-信息系统架构 | 数据架构

TOGAF是工业级的企业架构标准规范&#xff0c;信息系统架构阶段是由数据架构阶段以及应用架构阶段构成&#xff0c;本文主要描述信息系统架构阶段中的数据架构阶段。 如上所示&#xff0c;信息系统架构&#xff08;Information Systems Architectures&#xff09;在TOGAF标准规…

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化&#xff0c;企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本&#xff0c;并确保信息的透明度&#xff0c;成为了各大行业亟待解决的问题。而增强现实&#xff08;AR&#xff09;技术&#xff0c;特别…

C语言数组详解:从基础到进阶的全面解析

在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中&#xff0c;数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…

阴沟翻船题——Longest Substring Without Repeating Characters

一、事件概述 今天接到一个面试&#xff0c;让线上做题。面试官出了个leetcode的题。题目如图所示&#xff1a; 我没有刷过leetcode&#xff0c;上学时候我们做的hdu-acm和codeforces。咋一接到题目&#xff0c;看到是个字符串题&#xff0c;并且找最长字串&#xff0c;第一反…

ssm基于HTML5的红酒信息分享系统

SSM基于HTML5的红酒信息分享系统是一个专注于红酒领域的综合性信息平台&#xff0c;旨在为红酒爱好者、从业者以及普通消费者提供一个便捷的交流与获取红酒相关信息的空间。 一、系统背景与意义 随着人们生活水平的提高和消费观念的转变&#xff0c;红酒作为一种高雅的饮品&a…

【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

文章目录 一、Tag Body 数据块体结构 - Video Data 视频数据1、Vedio Data 视频数据 类型标识2、Vedio Data 视频数据 结构分析3、Composition Time Offset 字段涉及的时间计算4、AVC Packet Type 字段说明① AVC Sequence Header 类型② AVC NALU 类型③ AVC End of Sequence …

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具&#xff0c;它可以帮助用户快速、高效地构建 Docker 镜像&#xff0c;并支持多种平台的构建。使用 buildx&#xff0c;用户可以在单个命令中构建多种架构的镜像&#xff0c;例如 x86 和 ARM 架构&#xff0c;而无需手动操作多个…

Centos类型服务器等保测评整/etc/pam.d/system-auth

修改服务器配置文件/etc/pam.d/system-auth&#xff0c;但是&#xff0c;把一下配置放在password的配置第一行才会生效 执行命令&#xff1a;配置口令要求&#xff1a;大小写字母、数字、特殊字符组合、至少8位&#xff0c;包括强制设置root口令&#xff01; sed -i 14a pas…

精准捕捉,智能训练:数据手套在机器人灵巧手领域的应用探索

数据手套是一种内置多个高精度传感器&#xff0c;能够精准捕捉手部动作数据&#xff0c;并将其转化为数字信号的高科技穿戴设备。 MHand pro动捕数据手套其内置16个高精度传感器&#xff0c;能敏锐感知手指的弯曲、伸展等动作。这些传感器通过复杂的算法&#xff0c;将手部动作…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;关于视频180度实时旋转&#xff0c;请见本专栏前面的文章&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中…