Выбор самой последней даты в объединенной таблице - PullRequest
0 голосов
/ 06 августа 2020

Я не могу понять, как создать подзапрос, чтобы выбрать только самую последнюю дату из сгруппированных по значению sys_loc_code. Две таблицы E и R объединены в sys_sample_code. Я хочу указать отдельное значение для поля sys_loc_code. Я хочу, чтобы это были данные из строки, которая содержит последнюю дату в поле sample_date.

Код, который у меня есть на данный момент:

SELECT E.sample_date, E.sys_loc_code, R.sys_sample_code, R.chemical_name, R.result_value, R.detect, R.LabSampType
FROM GMP.GMP_Sample_Results AS R
INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
WHERE (R.chemical_name = N'Tetrachloroethene') and E.sample_date > '2016-01-01 00:00:00.000'
ORDER BY sys_loc_code, sample_date desc

Пожалуйста, посмотрите изображение для желаемого полученные результаты. Желаемые результаты выделены желтым.

введите описание изображения здесь

Я пробовал MAX, DISTINCT, несколько соединений, MAX DISTINCT, GROUP BY и множество других. Может ли кто-нибудь предложить код, который мне нужен, чтобы получить желаемые результаты. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Если вы используете ROW_NUMBER и PARTITION BY столбец, который должен быть уникальным, и ORDER BY столбец, который вы хотите получить самым последним из них, а затем берете только те результаты, где номер строки равен 1, вы должны получить то, что вы хотите.

SELECT sample_date, sys_loc_code, sys_sample_code, chemical_name, result_value, detect, LabSampType
FROM (
    SELECT E.sample_date, E.sys_loc_code, R.sys_sample_code, R.chemical_name, R.result_value, R.detect, R.LabSampType
      , ROW_NUMBER() OVER (PARTITION BY E.sys_loc_code ORDER BY sample_date DESC) RN
    FROM GMP.GMP_Sample_Results AS R
    INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
    WHERE (R.chemical_name = N'Tetrachloroethene') AND E.sample_date > '2016-01-01 00:00:00.000'
) X
WHERE RN = 1
ORDER BY sys_loc_code, sample_date DESC;
0 голосов
/ 06 августа 2020

Это код, который я использовал для получения желаемых результатов.

SELECT R.*, E.sample_date
FROM GMP.GMP_Sample_Results AS R
INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
INNER JOIN (
    SELECT sys_loc_code, MAX(sample_date) AS MAX_DATE
    FROM GMP.GMP_Sample_Events
    GROUP BY sys_loc_code
) AS MD ON E.sys_loc_code = MD.sys_loc_code AND E.sample_date = MD.MAX_DATE
WHERE (R.chemical_name = 'Tetrachloroethene') AND (E.sample_date > '2016-01-01-00:00:00.000')  
ORDER BY E.sys_loc_code

Я также заинтригован решениями TOP 1 и PARTITION, если кто-нибудь захочет объяснить, как я могу успешно получить их работай. Всегда есть более одного способа снять шкуру с кошки. Как новичок, чем больше инструментов у меня в памяти, тем лучше я буду выполнять свою работу. Спасибо всем, что помогли. @Dale K, если вы сможете найти решение ошибки в разделе комментариев, я также отмечу ваш ответ как ответ.

...