【问题标题】:Finding a min() date for one column and then using this to join with other tables that have a date LESS than this date为一列查找 min() 日期,然后使用它与日期小于该日期的其他表连接
【发布时间】:2020-03-05 08:46:52
【问题描述】:

简而言之,我有两张桌子:

(1)pharmacy_claims(列:user_iddate_serviceclaim_idrecord_idprescription

(2)medical_claims(列:user_iddate_serviceprovidernpicost

我想在 (1) 中找到具有特定prescription 值的user_id,找到它们最早的date_service(例如min(date_service)),然后将这些user_id 与它们的最早日期一起使用服务作为一个群组,从 (2) 中提取所有相关数据。基本上我想在他们第一次在pharmacy_claims 中开出给定处方之前找到他们所有的medical_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_id 的队列与 date_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's

(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】:

    我认为你只需要一个相关的子查询:

    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 = ?
                            );
    

    【讨论】:

    • 我认为这应该可行,但理想情况下,我想创建一个 user_id 和 Min_Date 的临时表,这样我就可以用作子选择(WHERE user_id in (select user_id from user.temp_pharmacy_claims_final_index. I试图使这个例子尽可能简单,但需要做一些子选择
    • @大卫。 . .无需创建临时表,这只会增加解决方案的复杂性。
    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多