【问题标题】:SQL - Returning distinct row for data with Max created timestamp valueSQL - 返回具有最大创建时间戳值的数据的不同行
【发布时间】:2013-08-11 05:59:42
【问题描述】:

在我的程序中,我审核传入的数据,可以是 4 种类型。如果数据满足所有要求的条件,它会成功存储在表列中,以及该行进入表时的消息类型和时间戳。

由于审计发生连接问题等问题,数据也可能被错误地写入表。程序将重试审核此数据,如果成功将写入新行,成功。所以你看我现在有两行数据的特定消息,一个成功,一个有错误,两者都有不同的时间戳。 (成功的时间戳比错误记录的最新。)

如果传入的数据不符合要求的标准,则会出现第三条消息被拒绝并写入记录,并再次带有创建时间戳。

我想做的是编写一个 Sybase SQL 查询,以仅拉回每条接收到的消息的记录,并带有最高的时间戳。

所以对于上面的错误示例,我不想返回错误记录,只返回进程重试并成功时的相应成功记录。

我想到了类似下面的东西..

SELECT distinct(*) 
    FROM auditingTable
        WHERE timestamp = (SELECT MAX(timestamp) from auditingTable)

虽然我知道这只会带回 1 条记录,在整个表中具有最高的时间戳。

无论其状态如何,我如何才能取回收到的每条消息的最新记录??

欢迎任何想法!

【问题讨论】:

    标签: sql database sybase


    【解决方案1】:

    我建议在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
    

    【讨论】:

      【解决方案2】:

      您没有提到您的 Sybase 版本。 你可以使用ROW_NUMBER() function

      例如,您的表有 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; 
      

      【讨论】:

        【解决方案3】:

        我想指出,对查询的简单修改允许您做您想做的事情(尽管我更喜欢 Valex 答案中的 row_number() 方法)。也就是将where子句中的子查询变成关联子查询:

        SELECT *
        FROM auditingTable at1
        WHERE timestamp = (SELECT MAX(timestamp)
                           from auditingTable at2
                           where at1.MessageId = at2.MessageId
                          );
        

        这是标准 SQL,应该适用于任何版本的 Sybase。

        【讨论】:

          猜你喜欢
          • 2021-12-28
          • 1970-01-01
          • 2017-06-23
          • 2021-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-01
          相关资源
          最近更新 更多