Вставить в другую таблицу после получения последней даты и выполнения внутреннего соединения - PullRequest
0 голосов
/ 04 мая 2018

У меня есть таблица с именем Member_Details, в которой есть несколько записей для каждого member_ID. Например,

enter image description here

У меня есть другая таблица с именем "BMI_Data", которая выглядит следующим образом.

enter image description here

Цель состоит в том, чтобы извлечь имена тех членов, чей "BMI" в "Member_Details" меньше, чем "target_BMI" в таблице "BMI_Data", и вставить его в новую таблицу с именем "results", используя "Member_ID, First_Name и ИМТ "как его схема. Кроме того, одним из соображений является выборка последних данных, доступных в «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

Приведенный выше запрос не извлекает самую последнюю дату и просто загружает все записи, в которых ИМТ члена меньше, чем target_BMI.

Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Альтернативный запрос может быть

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
0 голосов
/ 04 мая 2018

Хотелось бы отметить - такой даты как «31-апреля-2018» не существует! Вы могли бы иметь в виду «1 мая 2018»

В любом случае - важно убедиться, что при заказе по дате вы сначала приводите его к типу данных 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
0 голосов
/ 04 мая 2018

Сначала вы не указали условие после 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;
...