获取最新记录

时间:2019-11-01 23:18:43

标签: sql sql-server

在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 个答案:

答案 0 :(得分:1)

您可以创建一个相关子查询,该子查询为当前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)上建立索引。

注意:表别名使查询更易于阅读和理解;我相应地修改了您的查询。

答案 1 :(得分:1)

请尝试以下操作:

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

答案 2 :(得分:1)

我很确定这是您想要的:

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中的所有值都来自集合行。