我按如下方式存储日志:
LOG
ID | MODELID | EVENT
1 | 1 | Upped
2 | 1 | Downed
3 | 2 | Downed
4 | 1 | Upped
5 | 2 | Multiplexed
6 | 1 | Removed
然后我将模型设为:
MODEL
ID | NAME
1 | Model 1
2 | Model 2
我希望最终得到一个LOG项,其中LOG中的HIGHEST ID与模型相关联:
NAME | EVENT
Model 1 | Removed
Model 2 | Multiplexed
简单的连接为我提供了所有结果:
SELECT * FROM MODEL AS M LEFT JOIN LOG AS L
ON L.MODELID = M.ID
但这给了我所有的记录。我错过了什么?
答案 0 :(得分:2)
试试这个
SELECT M.NAME,L.EVENT FROM LOG L INNER JOIN MODEL M
ON L.MODELID = M.ID
WHERE L.ID IN
(
SELECT MAX(ID) FROM LOG GROUP BY MODELID
)
答案 1 :(得分:1)
也许你需要一个子选择。让我们从解决问题开始。
首先,您需要LOG表中给定MODELID的HIGHEST ID。
SELECT
MODELID
,MAX(ID)
FROM
LOG
GROUP BY
MODELID
现在,如果我们将其用作子选择(虚拟表),那么您还可以获取模型名称。
E.g。
SELECT
M.NAME
,L.EVENT
FROM
MODEL M
,(
SELECT
MODELID AS MODELID
,MAX(ID) AS MAXID
FROM
LOG
GROUP BY
MODELID
) S
,LOG L
WHERE
M.ID = S.MODELID
AND L.ID = S.MAXID
给它一个去(我自己没有测试过)。
答案 2 :(得分:0)
with cte as (
select M.NAME,L.EVENT, row_number() over(partition by M.ID order by L.ID desc) as row_num
from MODEL as M
inner join LOG as L on L.MODELID = M.ID
)
select NAME, EVENT from cte
where row_num = 1
请参阅sql fiddle示例
我不确定PostgreSQL,但我认为这个应该比计算max
更快,因为它只是一次而不是两次。此外,这些更好地概括 - 您可以通过多个列进行排序。