0

SQL の経験は限られていますが、問題の適切な解決策を見つけるために数日間検索しましたが、まだ見つかりません。明らかな答えが存在する場合、それを見つけるために適切なキーワードを使用していません。

システム ヘルス行をテーブルに挿入するハードウェア データ収集システムがあり、長期間にわたって 10 分ごとに 1 行挿入されます。このデータは、ハードウェア障害が発生した場合の診断情報として使用されます。このテーブルには、一意の DeviceID 列で識別される複数のデバイスのレコードが含まれています。このテーブルには、デバイスごとに最大 100K のレコードを保持する予定です。次のアルゴリズムを使用して、時々テーブルを圧縮する予定です。

特定の DeviceID の行数が 100K を超える場合、特定の DeviceID の行の最も古い 50% を選択し、選択範囲の 2 行目から始めて、これらの行を 2 行ごとに削除します。

このアルゴリズムには、最新のデータが 10 分間隔で保持され、古いデータが時間の経過とともに次第に広がるという望ましい機能があります。また、最初の (最も古い) レコードは削除されません。

最も古い 50K 行を選択するクエリの後に複数の単一行を削除することで、これを C# で簡単に実装できます。誰かがこれを行うためのより良い方法を知っていることを願っています。

それが役立つ場合は、各デバイスが異なるテーブルを持つようにデータを再編成できますが、C# の単一の仮想化グリッド ビューでレビュー用にデータを表示するのは複雑です。

ご協力いただきありがとうございます。

4

1 に答える 1

0

一般的なテーブル式を使用して、ここで問題の解決策を見つけたと思います( n 行ごとに SQL を削除する)。次のコードで、HealthID は DeviceHealth テーブルのインデックスです。DeviceID = 1 句はテスト用です。実際のコードでは、1 の代わりにパラメーターを使用します。

WITH cte AS (
    SELECT TOP 50 PERCENT t.*, ROW_NUMBER() OVER (ORDER BY t.HealthID)
        AS rank FROM [DeviceHealth] t WHERE DeviceID = 1)
DELETE cte WHERE rank%2 != 0

これはうまくいくようです。それを行うためのより良い方法はありますか、または良い解決策を見つけましたか?

于 2013-04-04T06:15:39.113 に答える