使用CASE语句排除特定的医疗保健索赔数据

问题描述 投票:0回答:1

我有两张雪花表用于会员健康声明。表 A 包含诊所的所有索赔,表 B 只是诊所的索赔,筛选到特定年份和我感兴趣的特定服务。

如果该成员在同一天完成了任何其他服务(此数据将来自表 A),我想从表 B(过滤后的表)中排除该成员的索赔。

示例:会员 C 在表 B 中。会员 C 在表 A 中,并且与表 B 的服务在同一日期完成了其他服务。为出现这种情况的行举起标志(两个图像中以红色突出显示的行)。

我尝试使用 CASE 语句进行以下查询:

SELECT DISTINCT 
B.*,
(CASE
    WHEN EXISTS
        (SELECT 1
        FROM TableA -- Table with all the claims --
        WHERE A.MemberID = B.MemberID 
        AND (A.Date = B.Date)
        AND A.Service != 1234) -- For claims for services I do NOT want, but are on the same day --
THEN 1
ELSE 0
END) AS EXCLUSION_FLAG
FROM TableB B -- Table with specific claims --

我正在尝试为表 B 的所有成员行(这些是具有我感兴趣的特定服务和年份的成员)获取一个标志,并查看应排除哪些行。我试图在行级的基础上得到这个。会员可能有“某些”主张应被排除,但这并不意味着该会员应被完全排除。 我得到的结果与我创建的标志混合(我看到一个成员的特定行返回了 0,而我预计它是 1)。我不太确定还有什么方法可以解决这个问题。任何意见或建议将不胜感激,非常感谢!

join snowflake-cloud-data-platform case
1个回答
0
投票

with table_a(m_id, service, date) as ( select * from values (1, 'x', 202001), (1, 'y', 202001), (1, 'x', 202002), (1, 'x', 202003), (1, 'x', 202002), (2, 'x', 202101), (2, 'x', 202102), (2, 'z', 202103), (3, 'x', 202105), (3, 'y', 202105), (3, 'x', 202106) ), table_b(m_id, service, date) as ( select * from values (1, 'x', 202001), (1, 'x', 202002), (1, 'x', 202003), (2, 'x', 202101), (3, 'x', 202105), (3, 'x', 202106) )

我们可以使用左连接来显示我们想要排除的行:

select * from table_b as b left join table_a as a on b.m_id = a.m_id and b.date = a.date and b.service != a.service order by 1,3;

给出:

所以现在用

where a.m_id is null

过滤掉这些行,并且考虑到我们知道连接的一侧是空的,我们应该更改为仅使用

b.*
值:
select 
    b.* 
from table_b as b
left join table_a as a
    on b.m_id = a.m_id 
        and b.date = a.date
        and b.service != a.service
where a.m_id is null
order by 1,3;

© www.soinside.com 2019 - 2024. All rights reserved.