Postgres:获取与记录关联的最高匹配日志?

时间:2013-08-08 09:01:53

标签: sql postgresql

我按如下方式存储日志:

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

但这给了我所有的记录。我错过了什么?

3 个答案:

答案 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更快,因为它只是一次而不是两次。此外,这些更好地概括 - 您可以通过多个列进行排序。