[英]SQL - Returning distinct row for data with Max created timestamp value
在我的程序中,我审计传入的数据,可以是4种类型。 如果数据满足所有必需条件,则会在表列中成功存储,以及将行输入表中的消息类型和时间戳。
由于诸如审计之类的连接问题等问题,数据也可能被错误地写入表中。 程序将重试审核此数据,如果成功将写入新行,则成功。 因此,您看到我现在有2行用于该特定数据消息,一行成功,一行有错误,两者都有不同的时间戳。 (成功具有最新时间戳而不是错误记录。)
第三条消息被拒绝,并且如果传入数据不符合所需标准,则会写入记录,同样使用创建时间戳。
我想做的是编写一个Sybase SQL查询,仅回退每个收到的消息的记录,具有最高的时间戳。
因此,使用上面的错误示例,我不想返回错误记录,只有相应的成功记录从进程重试时才成功。
我想到了类似下面的东西......
SELECT distinct(*)
FROM auditingTable
WHERE timestamp = (SELECT MAX(timestamp) from auditingTable)
虽然我知道这只会带回1条记录,整个表格中的时间戳最高。
我怎样才能收到收到的每封邮件的最新记录,无论其状态如何?
欢迎任何想法!
您还没有提到您的Sybase版本。 您可以使用ROW_NUMBER()函数
例如,您的表具有MessageId
,您可以在查询后使用MessageTime
字段:
SELECT * FROM
(
SELECT auditingTable.*,
ROW_NUMBER() OVER (PARTITION BY MessageID ORDER BY MessageTime DESC) as RN
FROM auditingTable
) as T
WHERE RN=1;
我想要注意,对查询的简单修改可以让你做你想做的事情(虽然我更喜欢Valex的答案中的row_number()
方法)。 这是将where
子句中的子查询转换为相关子查询:
SELECT *
FROM auditingTable at1
WHERE timestamp = (SELECT MAX(timestamp)
from auditingTable at2
where at1.MessageId = at2.MessageId
);
这是标准SQL,应该适用于任何版本的Sybase。
我建议在auditingTable
添加一个自动增量主键字段,以便更轻松地识别记录。 对于以下查询,我假设您已添加此列并将其命名为auditRecordId
。
假设您通过messageType
识别每条消息,那么以下内容应该有效:
SELECT A1.messageType,
A1.message
FROM auditingTable A1
INNER JOIN (
SELECT MAX(auditRecordId) auditRecordId,
messageType
FROM auditingTable
GROUP BY messageType
) A2 ON A1.auditRecordId = A2.auditRecordId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.