5

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

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

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

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

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

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

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

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

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

欢迎任何想法!

4

3 回答 3

5

您还没有提到您的 Sybase 版本。您可以使用ROW_NUMBER() 函数

例如,您的表有MessageIdMessageTime您可以使用以下查询的字段:

SELECT * FROM
 (
    SELECT auditingTable.*,
    ROW_NUMBER() OVER (PARTITION BY MessageID ORDER BY MessageTime DESC) as RN
    FROM auditingTable 
  ) as T
WHERE RN=1; 
于 2013-08-09T11:00:08.930 回答
4

我想指出,对查询的简单修改可以让你做你想做的事(尽管我更喜欢row_number()Valex 答案中的方法)。也就是把子where句中的子查询变成相关子查询:

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

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

于 2013-08-09T11:12:24.660 回答
0

我建议向 中添加一个自动增量主键字段,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
于 2013-08-09T11:00:01.603 回答