0

我按如下方式存储日志:

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 中具有最高 ID 的 LOG 条目,结果是:

NAME    | EVENT
Model 1 | Removed
Model 2 | Multiplexed

一个简单的连接给了我所有的结果:

SELECT * FROM MODEL AS M LEFT JOIN LOG AS L 
ON L.MODELID = M.ID

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

4

3 回答 3

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
)
于 2013-08-08T09:12:18.120 回答
1

也许你需要一个子选择。让我们从分解问题开始。

首先,您需要 LOG 表中给定 MODELID 的 HIGHEST ID。

SELECT
    MODELID
    ,MAX(ID)
FROM
    LOG
GROUP BY
    MODELID

现在,如果我们将其用作子选择(虚拟表),那么您还可以获得模型名称。

例如

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

试一试(我自己没有测试过)。

于 2013-08-08T09:10:27.917 回答
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,但我认为这应该比 count 更快max,因为它只是一次而不是两次。这也更好地概括了 - 你可以订购不止一列。

于 2013-08-08T11:42:18.280 回答