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