Frage

Anfang dieser Woche stelle ich eine Frage zu Ausfiltern doppelte Werte in der Reihenfolge zur Laufzeit. Hatte ein paar gute Antworten, aber die Menge der Daten war, ich würde über langsam und nicht durchführbar.

Zur Zeit in unserer Datenbank Ereigniswerte werden nicht gefiltert. Resultierende in doppelten Datenwerten (mit unterschiedlichen Zeitstempeln). Wir müssen diese Daten zur Laufzeit verarbeiten und auf Datenbankebene ist es an der Zeit teuer (und kann es in Code nicht ziehen, weil es viel in gespeicherte Prozeduren verwendet wird), was zu hohen Abfragezeiten. Wir brauchen eine Datenstruktur, die wir abfragen können, dass diese Datenspeicher hat herausgefiltert, so dass keine zusätzliche Filterung zur Laufzeit benötigt wird.

Zur Zeit in unserer 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’ (Sie benötigen diese löschen) **
  • 'F07331E4-26EC-41B6-BEC5-002AACA58337', '1', '2008-05-10 04: 05: 05.000'

Was wir brauchen,

  • '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'

Dies scheint trivial, aber unser Problem ist, dass wir diese Daten von drahtlosen Geräten zu bekommen, was in der richtigen Reihenfolge Pakete und unser Tor ist multithreaded, also können wir nicht die Werte garantieren wir sind in Ordnung. Etwas kann für 4 Sekunden wie eine ‚1‘ kommen und eine ‚0‘ für 2 Sekunden, aber wir verarbeiten die ‚1‘ schon, weil es zuerst in war. Wir haben unsere Köpfe sind Spinnen, wie dies zu implementieren. Wir können keine Daten auf den letzten Wert in der Datenbank vergleichen, da die neuesten möglicherweise nicht tatsächlich in noch gekommen ist, so dass die Daten werfen wir geschraubt werden würden und unsere Sequenz vollständig ausgeschaltet sein kann. Also zur Zeit speichern wir jeden Wert, der in und um die Datenbank schlurft sich um aus der Zeit basiert kommt .. aber die Einheiten 1,1,1,0 und seine gültige senden, weil das Ereignis noch aktiv ist, aber wir wollen nur die speichern auf und Zustand (erstes Auftreten der ein-Zustands 1,0,1,0,1,0) aus .. dachten wir über einen Trigger, aber wir würden jedes Mal mischen, um die Daten um einen neuen Wert in, weil es kam könnte dann die letzte Nachricht früher sein, und es kann die gesamte Sequenz ändern (Einsätze langsam wäre).

Irgendwelche Ideen?

Stellen Sie, wenn Sie weitere Informationen benötigen.

[EDIT] PK nicht funktionieren - das Problem ist, dass unsere Geräte tatsächlich in unterschiedlichen Zeitstempeln senden. so würde der PK nicht funktionieren, weil 1,1,1 gleich sind .. aber es hat unterschiedliche Zeitmarken. Es ist wie bei Veranstaltung time1 ging, Veranstaltung noch in time2, sendet er uns wieder beide .. gleichen Wert andere Zeit.

War es hilfreich?

Lösung

Hier ist ein Update-Lösung. Die Leistung wird in Abhängigkeit von Indizes abweichen.

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

Es ist nicht schwer, eine Filterlösung auf dieser Basis vorstellen. Es kommt nur darauf an, wie oft Sie den bisherigen Rekord für jeden Datensatz suchen (jede Abfrage oder ab und zu).

Andere Tipps

Wenn ich richtig verstehe, was Sie tun wollen, ist einfach die Betrogenen verhindern, dass auch in der Datenbank zu bekommen. Wenn das der Fall ist, warum nicht eine PK (oder einen eindeutigen Index) definiert auf den ersten beiden Spalten und haben die Datenbank für Sie tun, die schweres Heben. Dupe Einsätze würden auf der PK fail basiert oder AK AK Sie definiert haben. Sie sind Code (oder gespeicherte Prozedur) würde dann müssen nur anmutig, dass die Ausnahme behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top