SQL Выберите с помощью Join и требуется последняя запись

#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 в таблице устройств. Должно получиться две строки результата для моего случая.