【问题标题】:Insert into another table after fetching latest date and and performing an inner join在获取最新日期并执行内部连接后插入另一个表
【发布时间】:2018-05-04 09:45:05
【问题描述】:

我有一个名为“Member_Details”的表,其中每个 member_ID 都有多条记录。例如,

我有另一个名为“BMI_Data”的表,如下所示。

目标是获取那些“Member_Details”中“BMI”小于“BMI_Data”表中“target_BMI”的成员的姓名,并将其插入一个名为“results”的新表中,其中包含“Member_ID、First_Name 和BMI”作为其架构。 此外,一个考虑因素是获取每个成员的“Member_Details”中可用的最新数据(基于日期),然后进行比较

上述场景的结果将是这样的。

我尝试使用以下查询

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的所有记录。

请帮忙!

【问题讨论】:

  • 选择本身是否返回预期结果?

标签: sql join google-bigquery sql-insert


【解决方案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】:

    首先你没有指定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;
    

    【讨论】:

    • 你太棒了!非常感谢:)
    【解决方案3】:

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

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

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2015-05-16
      • 2013-02-09
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2018-03-10
      相关资源
      最近更新 更多