问题描述
我正在尝试创建一个查询,该查询将过滤一个表,然后只显示每个相应 TRIM Reference ID
的最新记录。
我正在制作一个更新状态系统,并且只想列出每个特定 TRIM Reference ID
的最新状态。每次 TRIM 参考 ID 具有新状态时,都会为该特定更新发布一个唯一 ID。因此,我知道我可以使用最高 ID 来确定要在输出表中显示的记录。
ID | TRIM 参考 ID |
---|---|
1 | 100 |
2 | 100 |
3 | 100 |
4 | 120 |
5 | 120 |
6 | 100 |
输出看起来像
ID | TRIM 参考 ID |
---|---|
5 | 120 |
6 | 100 |
我希望输出是一个表,每个 'TRIM Reference ID
' 都有最新的 ID
我试过了,但有错误:
SELECT [ID],[TRIM_Reference_ID],Max(ID)
FROM UpdateStatus
GROUP BY [TRIM_Reference_ID]
ORDER BY ID;
解决方法
select
max(ID) ID,[Trim reference id] Trim_Reference_ID
from
['Duplicate Data$']
group by
[Trim reference id]
order by
ID;
,
这是错误是因为使用 GROUP BY
表达式而没有定义您在 SELECT
语句中使用的所有字段,这些字段不是 聚合 函数 (MAX 、SUM、COUNT 等),如 here 所述。
要解决此问题,您需要将在 select 语句中使用的非聚合函数的所有字段添加到 GROUP BY
表达式中。或者仅在 SELECT
中返回您要分组依据的那些。像这样:
SELECT [TRIM_Reference_ID],Max(ID) ID
FROM UpdateStatus
GROUP BY [TRIM_Reference_ID]
ORDER BY ID;
,
如果需要整行,请使用相关子查询:
SELECT u.*
FROM UpdateStatus as u
WHERE u.id = (SELECT MAX(u2.id)
FROM UpdateStatus as u2
WHERE u2.TRIM_Reference_ID = u.TRIM_Reference_ID
)
ORDER BY ID;
无需在一个查询中获取 id,然后在另一个查询中获取行的其余部分——这听起来像是您正在采用的方法。