Sql 为一列查找min()日期,然后使用该日期与日期小于此日期的其他表联接
简而言之,我有两张桌子: 1药房申请栏:用户id、日期服务、申请id、记录id、处方 2个医疗索赔栏:用户id、日期服务、供应商、npi、成本 我想在1中找到具有特定处方值的用户id,找到他们最早的日期服务,例如mindate服务,然后将这些用户id与他们最早的服务日期一起用作队列,从2中提取所有相关数据。基本上,我想找到他们第一次在药房索赔中开处方之前的所有医疗索赔数据 药房联合声明如下:Sql 为一列查找min()日期,然后使用该日期与日期小于此日期的其他表联接,sql,apache-spark,apache-zeppelin,Sql,Apache Spark,Apache Zeppelin,简而言之,我有两张桌子: 1药房申请栏:用户id、日期服务、申请id、记录id、处方 2个医疗索赔栏:用户id、日期服务、供应商、npi、成本 我想在1中找到具有特定处方值的用户id,找到他们最早的日期服务,例如mindate服务,然后将这些用户id与他们最早的服务日期一起用作队列,从2中提取所有相关数据。基本上,我想找到他们第一次在药房索赔中开处方之前的所有医疗索赔数据 药房联合声明如下: user_id | prescription | date_service 1 a
user_id | prescription | date_service
1 a 2018-05-01
1 a 2018-02-11
1 a 2019-10-11
1 b 2018-07-12
2 a 2019-01-02
2 a 2019-03-10
2 c 2018-04-11
3 c 2019-05-26
例如,如果我对“处方='a'感兴趣,我只希望返回用户id 1和2,分别为2018-02-11和2019-01-02。然后我想从medical_声明中提取用户_id 1和2,并获取他们在这些日期之前的所有数据
我尝试这样做的方式是在pharmacy_claims表中构建一个临时表,以查询具有给定药物的用户id,然后将其返回到表中,以创建具有日期服务的用户id队列
以下是我所做的:
我从主药房索赔表中提取了所有相关数据:
CREATE TABLE user.temp_pharmacy_claims AS
SELECT user_id, claim_id, record_id, date_service
FROM dw.pharmacyclaims
WHERE date_service between '2018-01-01' and '2019-08-31'
这将导致约50000个用户id
2创建了一个仅包含用户id的mindate服务的表:
3创建最终表格以获得所需队列:
CREATE TABLE user.temp_pharmacy_claims_final_index AS
SELECT a.userid
FROM user.temp_pharmacy_claims a
LEFT JOIN user.temp_pharmacy_claims_index b
ON a.user = b.user
WHERE a.date_service < Min_Date
然而,当应该有几千个结果时,这会得到0个结果。这个设置正确吗?这可能不是最有效的方法,但在我看来它听起来不错,所以不确定发生了什么。我想您只需要一个相关的子查询:
select mc.*
from medical_claims mc
where mc.date_service < (select min(pc.date)
from pharmacy_claims pc
where pc.user_id = mc.user_id and
pc.prescription = ?
);
我认为这应该行得通,但理想情况下,我想创建一个包含用户id和最小日期的临时表,这样我就可以在user.temp\u pharmacy\u claims\u final\u索引中选择用户id作为子选择。我试着让这个例子尽可能简单,但需要在下面做一些子选择road@David . . . 不需要创建临时表,这只会增加解决方案的复杂性。
select mc.*
from medical_claims mc
where mc.date_service < (select min(pc.date)
from pharmacy_claims pc
where pc.user_id = mc.user_id and
pc.prescription = ?
);