5

私のプログラムでは、受信データを監査します。受信データには 4 つのタイプがあります。データが必要なすべての基準を満たしている場合、メッセージの種類と行がテーブルに入力されたときのタイムスタンプと共に、テーブルの列に正常に格納されます。

監査で接続の問題が発生するなどの理由で、データがエラーでテーブルに書き込まれることもあります。プログラムはこのデータの監査を再試行し、成功した場合は新しい行を書き込みます。ご覧のように、データの特定のメッセージに対して 2 つの行があり、1 つは成功、もう 1 つはエラーで、両方ともタイム スタンプが異なります。(エラーレコードよりも最新のタイムスタンプを持つ成功。)

拒否された 3 番目のメッセージが発生し、着信データが必要な基準を満たしていない場合はレコードが書き込まれ、ここでもタイムスタンプが作成されます。

私がやりたいのは、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 に答える