1

今週初め、実行時に重複する値を順番に除外する方法について質問しました。いくつかの良い答えがありましたが、調べていたデータの量が遅くなり、実行可能ではありませんでした.

現在、データベースでは、イベント値はフィルタリングされていません。データ値が重複する (さまざまなタイムスタンプを持つ)。実行時にそのデータを処理する必要があり、データベース レベルでは時間がかかります (また、ストアド プロシージャで頻繁に使用されるため、コードに取り込むことができません)。その結果、クエリ時間が長くなります。実行時に追加のフィルタリングが必要ないように、このデータ ストアをフィルタリングしてクエリできるデータ構造が必要です。

現在、DBにある

  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「1」、「2008-05-08 04:03:47.000」
  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「0」、「2008-05-08 10:02:08.000」
  • 'F07331E4-26EC-41B6-BEC5-002AACA58337', '0', '2008-05-09 10:03:24.000' (これを削除する必要があります) **
  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「1」、「2008-05-10 04:05:05.000」

私たちの必要なもの

  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「1」、「2008-05-08 04:03:47.000」
  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「0」、「2008-05-08 10:02:08.000」
  • 「F07331E4-26EC-41B6-BEC5-002AACA58337」、「1」、「2008-05-10 04:51:05.000」

これは些細なことのように思えますが、私たちの問題は、ワイヤレス デバイスからこのデータを取得することです。その結果、パケットのシーケンスが乱れ、ゲートウェイがマルチスレッド化されているため、取得した値が正しいことを保証できません。4 秒前は「1」、2 秒前は「0」のように何かが入ってくるかもしれませんが、「1」は最初に入っていたので既に処理しています。データをデータベースの最新の値と比較することはできません。実際には最新の値がまだ入っていない可能性があるためです。したがって、現在、入ってくるすべての値を保存し、データベースは時間に基づいて自分自身をシャッフルします..しかし、イベントはまだアクティブであるため、ユニットは 1,1,1,0 とその有効な値を送信できます。

何か案は?

さらに情報が必要かどうか尋ねます。

[編集] PK 機能しません - 問題は、ユニットが実際に異なるタイムスタンプを送信することです。1,1,1 は同じなので PK は機能しませんが、タイムスタンプが異なります。そのようなイベントは time1 で発生し、イベントは time2 で引き続き発生し、両方が返されます..同じ値の異なる時間。

4

2 に答える 2

1

私が正しく理解していれば、あなたがしたいのは、単に重複がデータベースに入らないようにすることです。その場合は、最初の2列にPK(または一意のインデックス)を定義して、データベースに手間をかけてもらいましょう。重複挿入は、定義したPKまたはAKに基づいて失敗します。あなたはコード(またはストアドプロシージャ)であり、その例外を適切に処理する必要があります。

于 2008-09-25T16:07:52.293 に答える
0

これが更新ソリューションです。パフォーマンスはインデックスによって異なります。

DECLARE @MyTable TABLE
(
  DeviceName varchar(100),
  EventTime DateTime,
  OnOff int,
  GoodForRead int
)

INSERT INTO @MyTable(DeviceName, OnOff, EventTime)
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 1, '2008-05-08 04:03:47.000' 
INSERT INTO @MyTable(DeviceName, OnOff, EventTime)
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 0, '2008-05-08 10:02:08.000' 
INSERT INTO @MyTable(DeviceName, OnOff, EventTime)
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 0, '2008-05-09 10:03:24.000'
INSERT INTO @MyTable(DeviceName, OnOff, EventTime)
SELECT 'F07331E4-26EC-41B6-BEC5-002AACA58337', 1, '2008-05-10 04:05:05.000' 

UPDATE mt
SET GoodForRead = 
CASE
  (SELECT top 1 OnOff
   FROM @MyTable mt2
   WHERE mt2.DeviceName = mt.DeviceName
     and mt2.EventTime < mt.EventTime
   ORDER BY mt2.EventTime desc
  )
  WHEN null THEN 1
  WHEN mt.OnOff THEN 0
  ELSE 1
END
FROM @MyTable mt
    -- Limit the update to recent data
--WHERE EventTime >= DateAdd(dd, -1, GetDate())

SELECT *
FROM @MyTable

これに基づくフィルタリング ソリューションを想像することは難しくありません。各レコードの前のレコードを検索する頻度 (すべてのクエリまたはたまに) に依存します。

于 2008-09-25T18:23:17.070 に答える