合并声明行以获得唯一值

Posted

技术标签:

【中文标题】合并声明行以获得唯一值【英文标题】:Combining Claim lines For Unique Values 【发布时间】:2018-06-01 15:14:16 【问题描述】:

我正在处理医疗索赔,其中一个索赔编号最多可包含 75 行。每个索赔都有一个代码,用于预测索赔的处理方式以及我需要为统计数据和有效的案例处理做的是将所有这些行组合在一起并仅获取唯一值 - 有些索赔可以有 20-30 行完全相同代码,我显然只需要知道这两个代码是什么,而不是每一行。我觉得这是一个简单的解决方案,但它只是逃避我的掌握。

原始数据:

Claim Number    EX1 Ex2 Ex3 Ex4 Ex5 Ex6
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    
123456789123    LP  DU  1O            
123456789123    LP  DP  AP  1O        
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            
123456789123    LP  DU  1O            

选择不同的:

Claim Number    EX1 Ex2 Ex3 Ex4 Ex5 Ex6
123456789123    LP  DP  AP  1O        
123456789123    LP  DU  1O            
123456789123    LP  IK  D3  AP  1O    

但我正在寻找的是类似的东西

Claim Number    Codes
123456789123    LP,DP,AP,1O,DU,IK,D3  

我能想到的唯一解决方案是通过添加行列来创建一个大文本字符串,将它们放在自己的表/子查询中,然后将它们加在一起,但我仍然会复制所有 EX 代码。另外,我不知道一个声明可能有多少不同的行,因此代码会是重复的并且对于那么多行来说很长。如果我只是将代码变成一个长文本字符串,我将能够搜索特定的声明,但我觉得有 t0 有一个更优雅的解决方案。

我试过搜索这个问题,但也许我不知道我在寻找什么,所以如果这是重复已经问过的问题,我很抱歉。我还应该说,我学到的任何 sql 很大程度上都是基于我需要做的,如果这个问题是基本的,我道歉>.>

【问题讨论】:

这是出于虚拟目的还是您正在设计实际的业务解决方案?如果是后者,那么有很多工具可以解析索赔文件,这些文件应该通过 837 ETL 格式进行通信。 设计解决方案。我们有分层分析师,需要根据谁可以处理我们的索赔来确定优先级。说实话,到目前为止,我们从供应商那里得到的支持并不令人惊讶。我们不得不想出很多我们自己的解决方案。 祝你好运。医疗保健是一头杂乱无章的野兽,索赔(专业、机构和牙科)尤其糟糕。 我认为您需要做的是 UNPIVOT 一切到行 (***.com/questions/18026236/…) ,然后 SELECT DISTINCT 忽略 Ex 指标的列,然后进行行连接 (***.com/questions/194852/…)跨度> 【参考方案1】:

如果我理解正确,您可以反透视然后合并代码:

with oc as (
      select distinct claim, ex
      from original o cross apply
           (values (ex1), (ex2), (ex3), (ex4), (ex5)) v(ex)
     )
select o.claim,
       stuff( (select ',' + ex
               from oc
               where oc.claim = o.claim
               for xml path ('')
              ), 1, 1, ''
            ) as codes
from (select distinct claim
      from original o
     ) o;

【讨论】:

【参考方案2】:

SQL Server 2012 版本:

with CTE as (
    select distinct [Claim_Number], [EX1] ex from TestTable
    union select [Claim_Number], [EX2] ex from TestTable
    union select [Claim_Number], [EX3] ex from TestTable
    union select [Claim_Number], [EX4] ex from TestTable
    union select [Claim_Number], [EX5] ex from TestTable
    union select [Claim_Number], [EX6] ex from TestTable
)
select [Claim_Number],
  Codes = STUFF((SELECT  ','+cast([ex] AS VARCHAR ) FROM  CTE t WHERE  C.[Claim_Number]  = t.[Claim_Number]  FOR XML PATH('')),1,1,'') 
from CTE C
group by Claim_Number

SQL Fiddle DEMO LINK


PS。你可以在 sql server 2017 中做到这一点

试试“使用uionGroup by Claim_Number + STRING_AGG

select [Claim_Number],STRING_AGG ( ex, ',')
from (
    select [Claim_Number], [EX1] ex from TestTable
    union select [Claim_Number], [EX2] ex from TestTable
    union select [Claim_Number], [EX3] ex from TestTable
    union select [Claim_Number], [EX4] ex from TestTable
    union select [Claim_Number], [EX5] ex from TestTable
    union select [Claim_Number], [EX6] ex from TestTable
) T
group by Claim_Number

SQL Fiddle DEMO LINK

【讨论】:

以上是关于合并声明行以获得唯一值的主要内容,如果未能解决你的问题,请参考以下文章

Hive SQL,如何检查多个先前的行以获得相同的引用

Python函数将多个列表中的唯一值合并到一个列表中

arcgis python获得字段唯一值

arcgis python 获得表字段的唯一值

无法获得加入两个表的唯一值

获得多个唯一值而不分离属于同一值块的值