为一列找到一个min()日期,然后使用它与日期小于此日期的其他表联接

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

总之,我有两个表:

((1)pharmacy_claims(列:user_iddate_serviceclaim_idrecord_idprescription)]

((2)medical_claims(列:user_iddate_serviceprovidernpicost)]

我想在(1)中找到具有某个user_id值的prescription,找到其最早的date_service(例如min(date_service)),然后使用这些user_id的最早日期为服务作为从(2)中提取所有相关数据的队列。基本上,我想在medical_claims中首次给他们指定处方之前找到他们的所有pharmacy_claims数据。

pharmacy_claims看起来像这样:

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'感兴趣,我只希望返回user_id 1和2,日期分别为2018-02-11和2019-01-02。然后,我想从medical_claims中提取user_id 1和2,并在这些日期之前获取其所有数据。

我尝试执行此操作的方法是在pharmacy_claims表中建立一个临时表以查询具有给定药物的user_id,然后将其退回到表中以创建队列user_iddate_service的关系>

这是我所做的:

((1)从主要药房索赔表中提取了所有相关数据:

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'

这导致〜50,000 user_id

((2)创建了一个仅包含user_idmin(date_service)的表:

CREATE TABLE user.temp_pharmacy_claims_index AS
SELECT distinct user_id, min(date_service) AS Min_Date
FROM user.temp_pharmacy_claims
GROUP BY 1

((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个结果。这个设置正确吗?这可能不是最有效的方法,但对我来说听起来不错,所以不确定发生了什么。

<<
sql apache-spark apache-zeppelin
1个回答
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 = ? );

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