我有一张名为" Member_Details"每个member_ID都有多条记录。例如,
我有另一张名为" BMI_Data"看起来如下。
目标是获取那些" BMI" in" Member_Details"小于" target_BMI"在" BMI_Data"表并将其插入一个名为"结果"的新表中。使用" 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的所有记录。
请帮忙!
答案 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