我在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
是否有一种替代分组的方法可以使用?
我总是想使用,其中
:
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时有效 例如: 执行此操作的另一种方