我如何根据详细信息行中的最大日期选择SQL选择连接到帐单明细行的标题记录

时间:2017-07-31 19:16:50

标签: sql-server

我需要根据索赔明细行中的最后服务日期选择索赔。我有2个表CLM_HDRCLM_DET。 从select返回的每一行代表声明的详细信息行以及声明标题中的数据。

CLM_HDR

|CLM_ID  |PATID |ADMIT_DT  |  
|--------|------|----------|  
|ub100   |2131  |2017-07-29|  
|ub110   |5215  |2017-07-15|  

CLM_DET

|CLM_ID  |PATID |LN_ID |DATE_OF_SERVICE|
|--------|------|------|---------------|
|ub100   |2131  |ln01  |2017-07-29     |  
|ub100   |2131  |ln02  |2017-07-30     |  
|ub100   |2131  |ln03  |2017-07-31     |  
|ub100   |2131  |ln04  |2017-08-01     |  
|ub110   |5215  |ln01  |2017-07-15     |  
|ub110   |5215  |ln02  |2017-07-16     |  

请原谅破折号,他们不在桌子旁边。

我需要选择'2017-01-01''2017-01-31'之间服务日期的声明。如果在'2017-01-31'之后有任何服务日期,则应排除整个记录(CLM_HDRCLM_DET)。

这是我尝试过的最后一件事:

SELECT c.CLM_ID,
       c.PATID,
       c.ADMIT_DT,
       d.LN_ID,
       d.DATE_OF_SERVICE
FROM   CLM_HDR c
INNER JOIN  CLM_DET d ON  
      c.CLM_ID = d.CLM_ID
WHERE c.ADMIT_DT between ‘2017-07-01’ and ‘2017-07-31’
GROUP BY    c.CLM_ID,
        c.PATID,
        c.ADMIT_DT,
        d.LN_ID,
        d.DATE_OF_SERVICE
HAVING (MAX(d.DATE_OF_SERVICE) <= ‘2017-07-31’)
AND (MIN(d.DATE_OF_SERVICE) > ‘2017-07-01’)
ORDER BY    c.CLM_ID, c.PATID  

它会返回包含ub100声明行的所有行,其中包含DATE_OF_SERVICE = '2017-08-01',我希望排除整个声明。我已经尝试过我能找到的所有东西,甚至还有一些东西。我的SQL知识相当有限。我感谢任何方向/帮助!感谢

2 个答案:

答案 0 :(得分:1)

如果您希望包含在指定日期之间发生事件的声明,但排除那些在特定日期之后发生事件的声明,您可以使用以下内容:

有几种方法可以编写此查询,我们可能会根据性能要求对其进行更改,但首先 - 请告知我是否满足您的功能要求。

JavaRDD

答案 1 :(得分:0)

您可以使用CTE进行相关查询(如果您愿意,可以不使用CTE)

with cte as(
select
    CLM_ID
from 
    CLM_HDR h
    inner join
    CLM_DET d on d.CLM_ID = h.CLM_ID
group by
    CLM_ID
having
    max(d.DATE_OF_SERVICE) <= '20170131')

select
    h.*
    ,d.*
from 
    CLM_HDR h
    inner join
    CLM_DET d on d.CLM_ID = h.CLM_ID
where
    h.CLM_ID in (select * from cte)
    and d.DATE_OF_SERVICE between '20170101' and '20170131'

INLINE VERSION

select
    h.*
    ,d.*
from 
    CLM_HDR h
    inner join
    CLM_DET d on d.CLM_ID = h.CLM_ID
where
    h.CLM_ID in (select
                    CLM_ID
                from 
                    CLM_HDR h
                    inner join
                    CLM_DET d on d.CLM_ID = h.CLM_ID
                group by
                    CLM_ID
                having
                    max(d.DATE_OF_SERVICE) <= '20170131') 
    and d.DATE_OF_SERVICE between '20170101' and '20170131'