AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL code zum Prüfen auf Datenänderung
Thema durchsuchen
Ansicht
Themen-Optionen

SQL code zum Prüfen auf Datenänderung

Ein Thema von braini4c · begonnen am 3. Feb 2009 · letzter Beitrag vom 4. Feb 2009
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: SQL code zum Prüfen auf Datenänderung

  Alt 3. Feb 2009, 23:02
Halt! In meiner Query ist ein kleiner Schusseligkeitsfehler: Ich zähle die Anzahl der Tage, aber wir wollen ja die Differenz zwischen dem niedrigsten und höchsten Datum, zwischen dem sich der Wert einer ID *nicht* geändert hat. Meine Query funktioniert also nur (und nur dann!), wenn an jedem Tag ein Eintrag in der Tabelle existiert.

Bezogen auf meinen Ansatz, der eine temporäre Tabelle verwendet, würde '@Table' also wie folgt initialisiert:
SQL-Code:
insert into @Table
select id, wert, 1 + DateDiff (day, min (Datum), max (Datum)) as Tage
  from test
group by id,wert
Das ist -wohl gemerkt- Microsoft-SQL, also nicht kompatibel zu MySQL. Falls Du mit temporären Tabellen arbeiten kannst, müsstest du die Syntax nur entsprechend anpassen. Die hier verwendete Funktion 'DateDiff' berechnet die Anzahl der Tage zwischen den beiden Tagen. Ich hoffe, MySQL hat eine entsprechende Funktion.

Bezüglich der schwächelnden Performance kann ich nur omata beipflichtet, das hier offenbar ein Index fehlt. Noch was: Temporäre Tabellen wirken oft Wunder, speziell, wenn sie -wie hier- eine Query stark vereinfachen, die sonst eine komplexe Subquery mehrmals ausführen würde.
Ich erwarte im Übrigen eine Abarbeitungszeit (wenn der Index auf ID+Wert gesetzt ist) von unter einer Sekunde, falls die Query syntaktisch korrekt ist.

Entschuldige, das ich kein MySQL kann, aber ich denke, die Gurus kriegen das hin.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: SQL code zum Prüfen auf Datenänderung

  Alt 3. Feb 2009, 23:25
Leider kann MySQL eine temporäre Tabelle nur einmal in einer Abfrage verwenden.

@alzaimar: Ist cnt jetzt tage?
SQL-Code:
select distinct id, tage
from (select id, wert, datediff(min(Datum), max(Datum)) AS tage
      from tabelle1
      group by id, wert) x
where x.tage = (select max(tage)
                from (select id, wert, datediff(min(Datum), max(Datum)) AS tage
                      from tabelle1
                      group by id, wert) y
                where y.id = x.id)
order by 1
Zitat von alzaimar:
...Noch was: Temporäre Tabellen wirken oft Wunder, speziell, wenn sie -wie hier- eine Query stark vereinfachen, die sonst eine komplexe Subquery mehrmals ausführen würde.
Ich danke dir für diesen mutigen Hinweis, ich verwende diesen Denkansatz auch häufiger und bin immer wieder positiv überrascht. Für solche Aussagen wird man hier ja auch häufiger mal gesteinigt. Aber wer es nicht glauben will, dem ist eben nicht mehr zu helfen.

MSSQL ist in dieser Hinsicht einfach performanter und flexibler. Leider ist MySQL hier etwas hinterweltlich.

Zitat von alzaimar:
...Ich erwarte im Übrigen eine Abarbeitungszeit (wenn der Index auf ID+Wert gesetzt ist) von unter einer Sekunde, falls die Query syntaktisch korrekt ist.
In MsSQL ja, in MySQL wäre ich mit solcher Aussage vorsichtig. Da dauert eine Abfrage, die MSSQL in 0 Sekunden erledigt, eventuell schonmal einige Minuten.
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#13

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 01:08
Dafür werde ich jetzt wahrscheinlich gesteinigt, aber ich glaube, hier einen typischen Fall völlig überflüssiger SQL-Euphorie vorzufinden!
Was wollt ihr mit solchen SQL-Statements sparen?
Zeit? Aufwand?
Das wird nicht gehen!

Es geht doch wirklich viel einfacher.
Einfach alle Datensätze genau einmal lesen,
nämlich sortiert nach ID (aufsteigend) und Datum (absteigend)
mit weniger kommt auch das raffinierteste SQL-Statement nicht aus.
Dann lässt sich alles ganz easy im Programm selbst auswerten ...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 01:15
Ist das raffiniert genug?
SQL-Code:
SELECT id, COUNT(*)
FROM table1
JOIN table2
ON table1.id=table2.id
AND table1.wert=table2.wert
GROUP BY id
Allerdings gibt es hier eine Einschränkung:

Der Wert darf niemals wieder einen historischen Wert annehmen. In deinem Beispiel sieht es so aus, als ob der Wert sich immer erhöht, wenn er sich ändert. Dann sollte der Select funktionieren.

Sollte der Wert sich in 2 Richtungen bewegen (+/-) dann sehe ich als einzig vernünftige Möglichkeit hier mit einem Trigger auf Tabelle1 zu arbeiten. Die Tabelle2 würde ich dann über den Trigger füllen lassen und dort ein zusätzliches Feld anlegen mit der Anzahl der Tagen seit der letzten Änderung.

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#15

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 01:20
Zitat:
Der Wert darf niemals wieder einen historischen Wert annehmen
Eben!
Es dreht sich um ein Problem bezüglich der Reihenfolge, in der die Werte auftreten, deshalb sind WHERE-Klauseln fast schon für die Katz
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 01:23
Darum ja auch in dem Fall der sich wiederholenden Werten pro Id der Hinweis auf die Trigger.

Er hat ja eh schon eine Tabelle mit den aktuellen Werten, da kann er auch noch eine Spalte vertragen, wo die Anzahl der Tage seit der letzen Änderung drin steht.

Denn ansonsten muss - as u said - wirklich jeder Datensatz durchgelesen werden ... und wer will das schon ...

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#17

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 01:29
Zitat:
da kann er auch noch eine Spalte vertragen
das ist natürlich wahr!
  Mit Zitat antworten Zitat
braini4c

Registriert seit: 26. Jun 2008
13 Beiträge
 
#18

Re: SQL code zum Prüfen auf Datenänderung

  Alt 4. Feb 2009, 17:23
Erst einmal vielen Dank für die raschen Antworten.

Der Wert kann auch wieder abnehmen, ist unwahrscheinlicher, aber kommt vor.

Ich habe mit hilfe einer anleitung etwas zusammengeschustert, was mir im Prinzip das gibt was ich benötige, wenn auch nicht exakt das, was ich ursprünglich beschrieben hatte (Anzahl der Tage pro ID)

SQL-Code:
SELECT id_ FROM
    (SELECT id as id_, wert as wert_
     FROM table1
     WHERE datum >= SUBDATE(NOW(), INTERVAL 5 DAY) )
     as tmp_wert
GROUP BY id_ HAVING MAX(wert_) = MIN(wert_) and COUNT(wert_) >= 5;
Muss gestehen so ganz hab ich noch nicht verstanden warum es funktioniert...
Sollte mir mal näher den subquery syntax anschauen.
Aber es geht fix und ich muss "nur" die Zahlen anpassen. Da ich aber eh an nem fixen Wert für die Anzahl der Tage interessiert bin (5) is das für mich OK.

Vielen Dank an Alle !
MfG
Julian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz