dea*_*au5 5 sql database sybase
在我的程序中,我审计传入的数据,可以是4种类型.如果数据满足所有必需条件,则会在表列中成功存储,以及将行输入表中的消息类型和时间戳.
由于诸如审计之类的连接问题等问题,数据也可能被错误地写入表中.程序将重试审核此数据,如果成功将写入新行,则成功.因此,您看到我现在有2行用于该特定数据消息,一行成功,一行有错误,两者都有不同的时间戳.(成功具有最新时间戳而不是错误记录.)
第三条消息被拒绝,并且如果传入的数据不符合要求的标准,则会写入记录,同样使用创建时间戳.
我想做的是编写一个Sybase SQL查询,仅回退每个收到的消息的记录,具有最高的时间戳.
因此,使用上面的错误示例,我不想返回错误记录,只有相应的成功记录从进程重试时才成功.
我想到了类似下面的东西......
SELECT distinct(*)
FROM auditingTable
WHERE timestamp = (SELECT MAX(timestamp) from auditingTable)
Run Code Online (Sandbox Code Playgroud)
虽然我知道这只会带回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;
Run Code Online (Sandbox Code Playgroud)
我想指出的是,对您的查询进行简单的修改就可以让您做您想做的事情(尽管我更喜欢row_number()Valex 答案中的方法)。即将子句中的子查询变成where相关子查询:
SELECT *
FROM auditingTable at1
WHERE timestamp = (SELECT MAX(timestamp)
from auditingTable at2
where at1.MessageId = at2.MessageId
);
Run Code Online (Sandbox Code Playgroud)
这是标准 SQL,应该适用于任何版本的 Sybase。