Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为一列查找min()日期,然后使用该日期与日期小于此日期的其他表联接_Sql_Apache Spark_Apache Zeppelin - Fatal编程技术网

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

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

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

1药房申请栏:用户id、日期服务、申请id、记录id、处方

2个医疗索赔栏:用户id、日期服务、供应商、npi、成本

我想在1中找到具有特定处方值的用户id,找到他们最早的日期服务,例如mindate服务,然后将这些用户id与他们最早的服务日期一起用作队列,从2中提取所有相关数据。基本上,我想找到他们第一次在药房索赔中开处方之前的所有医疗索赔数据

药房联合声明如下:

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