我需要根据索赔明细行中的最后服务日期选择索赔。我有2个表CLM_HDR
和CLM_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_HDR
和CLM_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知识相当有限。我感谢任何方向/帮助!感谢
答案 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'