繁体   English   中英

SQL - 使用Max创建的时间戳值返回数据的不同行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM