当前位置: 首页 > 知识库问答 >
问题:

SQL-获取ID的最新记录并保留空列

司马飞
2023-03-14

我在MySQL中处理一个查询,它会给我一个特定ID的最新时间戳,但在列中保留它的空值,这是group by使它很难做到的。

在我的日志数据库中,我知道如果最新记录包含错误消息,则可以将其视为“失败”,但使用group by会给我该消息的最新错误消息,而不管它是否是最新记录。

Select MAX(Timestamp), CountryCode, ErrorMsg, MsgID from messages where
CountryCode = 'AU' group by MsgID;

因此,我尝试选择带有MAX(Timestamp)的最新值来获取该消息的最新记录,以便检查ErrorMsg列是否为空。

Timestamp           CountryCode     ErrorMsg        MsgId
2016-04-11 03:10:32     AU       Queued for retry    23
2016-04-11 05:23:42     AU       Queued for retry    24
2016-04-11 05:50:40     AU                           25
2016-04-11 08:19:43     AU                           26
2016-04-11 08:40:06     AU       Queued for retry    32
2016-04-11 08:40:50     AU       Queued for retry    33

是否有一种替代分组的方法可以使用?

共有1个答案

子车宏浚
2023-03-14

我总是想使用,其中:

select m.*
from messages m
where m.timestamp = (select max(m2.timestamp) from messages m2 where m2.msgid = m.msgid);

为了获得最佳性能,需要消息(msg_id,timestamp)的索引。

请注意,您的查询使用了MySQL(mis)特性,该特性允许select中的列不在组by中。我不鼓励你这样做,除非你真的,真的,真的知道你在做什么。通常,这不是标准SQL的一部分,在其他数据库中也不起作用(在标准和其他一些数据库中允许这样做的情况非常有限)。

 类似资料:
  • 问题内容: 如何获取刚刚插入的新记录的自动生成的ID?(使用ASP Classic和MSSQL 2005) 问题答案: 感谢所有建议SELECT SCOPE_IDENTITY()的人。我能够创建一个存储过程: 并使用VB调用存储过程: 现在,只要我引用新创建的ID,就可以使用resultID。

  • 问题内容: 我有三个表: 我需要获取每次测量的最新事件(过去的事件)及其相关的eventvalues数据。 我当前的查询很丑陋: 而且只允许我从表格中选择一列(我需要更多) 有什么方法可以使用联接来完成此操作吗? 编辑 :即使它们在第一个事件之前,我也需要从测量表中选择所有条目(即,为连接选择空数据) 问题答案: 您可以使用CROSS APPLY。

  • 问题内容: 在下表中,如何仅根据登录列获取的 最新记录 ,而不是所有3条记录? 问题答案: 使用按ID分组的汇总。这将列出每个最新的。 要获取完整的单个记录,请对仅返回每个ID 的子查询执行。

  • 问题内容: 我知道我可以像这样更新一条记录-但是如何获取已更新记录的ID?(我正在使用MSSQL,所以不能使用Oracle的RowId) 如果我要执行插入操作,则可以使用getGeneratedKeys来获取id字段值,但是我不认为有等效的更新吗? 我知道我可以使用可滚动的结果集来做我想做的事 即 但是我担心性能,因为测试显示负载下的锁定超时,我想知道是否有更好/更简单的方法? -编辑:为了最终解

  • 问题内容: 所以我有两个表,一个是RAWtable,另一个是MAINtable,如果存在多个记录(比较相同的名称,代码),我必须获取最新的groupID。例如,我在RAWtable上有这个: 这两个记录应视为一个,并且应仅返回此值: 该行是应插入主表中的唯一行。提供返回的最新GroupID(groupid是日期和时间的组合) 我已经尝试过了,但是没有用: 我怎样才能做到这一点?多谢。 问题答案:

  • 问题内容: 我使用以下查询将多个记录插入到表中: 由于查询要插入多个记录,因此无法使用 SCOPE_IDENTITY 来检索PK。有什么方法可以获取最近插入记录的ID? 问题答案: SCOPE_IDENTITY()将正确为您提供LAST ID。您需要将其与@@ Rowcount结合使用,以提供ID范围。 正如其他Richard指出的那样 ,这仅在您将增量设置为1时有效 例如: 执行此操作的另一种方