#sql #join #max
#sql #Присоединиться #макс
Вопрос:
У меня есть следующие таблицы:
devices table
SN tested_device_id test_setup_id
129 6 103
129 7 104
130 8 106
test_setup table
test_setup_id data1
103 111
104 333
106 555
Я хочу доставить SN, test_setup_id, data1 для последнего экземпляра каждого
serial number as follows:
129,104,333
130,106,555
(Исключая более раннюю копию SN 129).
У меня есть следующий запрос, который доставляет обе записи для SN 129, и я не знаю, как настроить его так, чтобы доставлять только последнюю из них:
SELECT sn,
test_setup_id,
data1
FROM test_setup
INNER JOIN devices
ON test_setup.test_setup_id = devices.test_setup_id
Любая помощь будет приветствоваться. Спасибо.
Ответ №1:
Попробуйте это
SELECT d.sn,
d.test_setup_id,
ts.data1
FROM (SELECT d.sn,
MAX(d.test_setup_id) test_setup_id
FROM devices d
GROUP BY d.sn) maxsetupid
INNER JOIN devices d
ON maxsetupid.test_setup_id = d.test_setup_id
INNER JOIN test_setup ts
ON d.test_setup_id = ts.test_setup_id
Ответ №2:
SELECT
d.SN, d.test_setup_id, ts.data1
FROM devices d
LEFT JOIN devices d2 ON d.SN = d2.SN and d.test_setup_id < d2.test_setup_id
INNER JOIN test_setup ts ON d.test_setup_id = ts.test_setup_id
WHERE d2.SN IS NULL
Ответ №3:
Если test_setup_id всегда увеличивается, вы можете сделать что-то вроде:
SELECT sn,
test_setup_id,
data1
FROM test_setup
INNER JOIN devices
ON test_setup.test_setup_id = devices.test_setup_id
WHERE test_setup_id = (SELECT MAX(test_setup_id)
FROM test_setup)
Комментарии:
1. -1: Вы выбираете единственное максимальное значение для всей таблицы test_setup, поэтому единственная строка, которую вы бы вернули, это
test_setup_id = 106
2. выбор, который он использует для where.
3. Ваше предложение where,
where test_setup_id = (select max(test_setup_id) from test_setup)
, вернет только 1 строку, случай, когдаtest_setup_id = 106
4. На самом деле, я хотел последнюю строку для каждого SN в таблице устройств. Должно получиться две строки результата для моего случая.