Получить самую последнюю запись - PullRequest
1 голос
/ 02 ноября 2019

В SQL Server я использую две таблицы (AOC_MODEL и PACKAGE, которые я объединил. Я хочу получить самую последнюю версию из столбца I_FW для каждого AOC_ID.

SELECT
    AOC_MODEL.AOC_ID,
    AOC_MODEL.CONTROLLER, 
    AOC_MODEL.AOC_FORM_FACTOR, 
    PACKAGE.I_FW, 
    PACKAGE.ETRACK_ID, 
    PACKAGE.ECO,
    PACKAGE.ECO_DATE
FROM            
    AOC_MODEL 
    INNER JOIN PACKAGE
        ON AOC_MODEL.AOC_ID = PACKAGE.AOC_ID
WHERE CONTROLLER LIKE 'intel%'

Я ожидаю, чтобыть в состоянии показать одну запись с наибольшим номером из столбца I_FW для любого заданного AOC_ID.

Как и на прикрепленном рисунке, я хотел бы видеть 2 элемента только там, где AOC_ID 117 имеетнаибольшее число 1.93 по сравнению с другими 117 элементами, а также AOC_ID 118 с номером 1.20. Поэтому в этом случае я хотел бы видеть ТОЛЬКО два элемента вместо 11.

SQL Query

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Пожалуйста, попробуйте что-то вроде этого:

SELECT AOC_MODEL.AOC_ID
       , AOC_MODEL.CONTROLLER
       , AOC_MODEL.AOC_FORM_FACTOR
       , MAX(PACKAGE.I_FW)
       , MAX(PACKAGE.ETRACK_ID)
       , MAX(PACKAGE.ECO)
       , MAX(PACKAGE.ECO_DATE)
FROM AOC_MODEL INNER JOIN PACKAGE
ON AOC_MODEL.AOC_ID = PACKAGE.AOC_ID
WHERE CONTROLLER LIKE 'intel%'
GROUP BY AOC_MODEL.AOC_ID
         , AOC_MODEL.CONTROLLER
         , AOC_MODEL.AOC_FORM_FACTOR

Вот это DEMO

1 голос
/ 02 ноября 2019

Я почти уверен, что это то, что вам нужно:

SELECT m.AOC_ID, m.CONTROLLER,  m.AOC_FORM_FACTOR, 
       p.I_FW, p.ETRACK_ID, p.ECO, p.ECO_DATE
FROM AOC_MODEL m JOIN
     (SELECT p.*,
             ROW_NUMBER() OVER (PARTITION BY AOC_ID ORDER BY I_FW DESC) as seqnum
      FROM PACKAGE p
     ) p
     ON m.AOC_ID = p.AOC_ID
WHERE aoc.CONTROLLER LIKE 'intel%' AND p.seqnum = 1;

Все значения из PACKAGE в наборе результатов взяты из заданной строки.

1 голос
/ 02 ноября 2019

Вы можете создать коррелированный подзапрос, который восстанавливает наивысший i_wf для текущего aoc_id и использовать его для фильтрации объединения на package, например:

select
    a.aoc_id,
    a.controller, 
    a.aoc_form_factor, 
    p.i_fw, 
    p.etrack_id, 
    p.eco,
    p.eco_date
from            
    aoc_model a
    inner join package p
        on a.aoc_id = p.aoc_id
        and p.i_wf = (
            select max(p1.i_wf)
            from package p1
            where p1.aoc_id = p.aoc_id
        )
where controller like 'intel%'

Для производительности рассмотритеиндекс package(aoc_id, i_wf).

Примечание: псевдонимы таблиц облегчают чтение и понимание запроса;Я изменил ваш запрос соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...