在获取最新日期并执行内部联接后插入另一个表

时间:2018-05-04 09:45:06

标签: sql join google-bigquery sql-insert

我有一张名为" Member_Details"每个member_ID都有多条记录。例如,

enter image description here

我有另一张名为" BMI_Data"看起来如下。

enter image description here

目标是获取那些" BMI" in" Member_Details"小于" target_BMI"在" BMI_Data"表并将其插入一个名为"结果"的新表中。使用" Member_ID,First_Name和BMI"作为其架构。 此外,一个考虑因素是获取" Member_Details"中可用的最新数据。为每个成员(根据日期),然后进行比较

上述情况的结果将是这样的。

enter image description here

我尝试使用以下查询

INSERT INTO results_table (Member_ID, First_Name, BMI)  
select  c.Member_ID, First_Name, BMI 
from 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY Member_ID ORDER BY Date desc) 
AS ROWNUM FROM Member_Details) x  
JOIN 
BMI_Data c ON x.Member_ID = c.Member_ID 
where 
x.BMI < c.Target_BMI

上述查询无法获取最新日期,只需加载成员BMI小于target_BMI的所有记录。

请帮忙!

3 个答案:

答案 0 :(得分:1)

首先,您未在row_numbers定义

之后指定条件
INSERT INTO results_table (Member_ID, First_Name, BMI)  
select  c.Member_ID, First_Name, BMI 
from  (SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY Member_ID ORDER BY Date desc)  AS ROWNUM 
       FROM Member_Details
      ) x  JOIN BMI_Data c 
                ON x.Member_ID = c.Member_ID 
where x.ROWNUM = 1 and x.BMI < c.Target_BMI;

答案 1 :(得分:1)

备用查询可能是

INSERT INTO results_table (Member_ID, First_Name, BMI)
select md2.member_ID, md2.First_Name, md2.BMI
from BMI_Data bd
inner join (select distinct md.member_ID ,md.First_Name ,(select top 1 BMI from Member_Details where member_ID = md.member_ID order by Date desc) BMI from Member_Details md) md2 on md2.member_ID = bd.member_ID
where md2.BMI < bd.Target_BMI

答案 2 :(得分:1)

想要注意 - 没有'31-Apr-2018'这样的日期!你的意思可能是“2018年5月1日”

在任何情况下 - 确保按日期排序时,首先将其转换为DATE数据类型非常重要,否则排序不正确。下面使这个顺序正确,另外通过使用带有ORDER BY和LIMIT 1的ARRAY_AGG()来提出替代方法

#standardSQL
INSERT INTO results_table (Member_ID, First_Name, BMI)
SELECT * EXCEPT(Target_BMI)
FROM (
  SELECT Member_ID, First_Name, 
    ARRAY_AGG(BMI ORDER BY PARSE_DATE('%d-%B-%Y', Date) DESC LIMIT 1)[OFFSET(0)] BMI
  FROM `project.dataset.member_details`
  GROUP BY Member_ID, First_Name
) d
JOIN `project.dataset.bmi_data` t
USING(Member_ID)
WHERE BMI < Target_BMI