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 1 von 2  1 2      
braini4c

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

SQL code zum Prüfen auf Datenänderung

  Alt 3. Feb 2009, 13:00
Datenbank: mySQL • Version: 5 • Zugriff über: Zeos 6.6.2-RC
Hallo,

ich hätte eine Frage bezüglich einer Tabelle mit folgender Struktur:

table1
id wert datum
1, 5, 30.12.2008
1, 5, 31.12.2008
1, 5, 1.1.2009
2, 3, 30.12.2008
2, 8, 31.12.2008
2, 20, 1.1.2009
3, 4, 30.12.2008
3, 10, 31.12.2008
3, 10, 1.1.2009
...

Ist es möglich eine SQL Abfrage zu schreiben die mir ausgibt seit wieviel Tagen sich der 'wert' einer 'ID'# nicht geändert hat ? (Pro Tag gibt es einen Datensatz)

In diesem falle also:
ID erg
1 3
2 1
3 2

Das einzige was ich bisher hinbekommen habe war etwas, was zumindest den fall ID 1 erschlägt, wenn sich der Wert noch nie geändert hat:
 Select ID,Count(datum) from table1 group by id having Max(wert)=Min(wert); Kann man das irgendwie auf den allgemeineren Fall erweitern?
(ich möchte ungern ein script schreiben, was die ID alle einzeln durchgeht, da es sehr viele Datensätze sind)
Wäre schön wenn mir jemand einen Tip geben könnte.

Viell. noch als Ergänzung: ich habe auch noch eine table2 in der u.a. der jeweils aktuelle 'wert' und die 'ID' drinsteht.

MfG
Julian
  Mit Zitat antworten Zitat
omata

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

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

  Alt 3. Feb 2009, 13:26
Vielleicht so...
SQL-Code:
SELECT id, DAY(CURRENT_TIMESTAMP - MAX(datum)) - 1 AS tage
FROM table1
GROUP BY id
  Mit Zitat antworten Zitat
braini4c

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

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

  Alt 3. Feb 2009, 13:36
sry falls ich mich unklar ausgedrückt haben sollte.
Aber jeder Datensatz bekommt ein update pro Tag. Egal ob sich 'wert' ändert oder nicht, daher kann ich nicht nach dem letzten Datum suchen und es mit dem heutigen vergleichen.
Mfg
Julian
  Mit Zitat antworten Zitat
omata

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

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

  Alt 3. Feb 2009, 15:54
Ups, sorry habe nicht genau gelesen...

Neuer Vorschlag...
SQL-Code:
SELECT id, MIN(datum) datum, TO_DAYS(CURRENT_TIMESTAMP) - TO_DAYS(MIN(datum)) AS tage
FROM tabelle1 x
WHERE EXISTS (SELECT *
              FROM tabelle1 y
              WHERE EXISTS (SELECT *
                            FROM tabelle1 z
                            WHERE datum = (SELECT MAX(datum)
                                           FROM tabelle1
                                           WHERE id = z.id)
                              AND id = y.id
                              AND wert <> y.wert)
                AND id = x.id
              GROUP BY id
              HAVING x.datum > MAX(datum))
GROUP BY id
Edit: Hier nochmal ein weiterer Vorschlag, für den Sonderfall, dass es keine Änderungen innerhalb einer ID gab...
SQL-Code:
SELECT id, MIN(datum) datum, TO_DAYS(CURRENT_TIMESTAMP) - TO_DAYS(MIN(datum)) AS tage
FROM tabelle1 x
WHERE EXISTS (SELECT *
              FROM tabelle1 y
              WHERE ( EXISTS (SELECT *
                                FROM tabelle1 z
                                WHERE datum = (SELECT MAX(datum)
                                               FROM tabelle1
                                               WHERE id = z.id)
                                  AND id = y.id
                                  AND wert <> y.wert)
                     OR NOT EXISTS (SELECT *
                                    FROM tabelle1
                                    WHERE id = y.id
                                      AND wert <> y.wert))
                AND id = x.id
              GROUP BY id
              HAVING x.datum > MAX(datum)
                  OR (SELECT COUNT(DISTINCT wert)
                      FROM tabelle1
                      WHERE id = y.id) = 1)
GROUP BY id
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

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

  Alt 3. Feb 2009, 18:42
Hier ist mein Beitrag (in T-SQL):
SQL-Code:
select distinct id, cnt
  from (
    select id, wert, count (*) as cnt
     from test
    group by id,wert
    ) x
where x.cnt = (
  select max (cnt) from (
    select id, wert, count (*) as cnt
     from test
    group by id,wert
    ) y where y.id=x.id
  )
order by 1
oder mit einer temporären Tabelle (übersichtlicher, geht aber in MySQL vermutlich nicht)
SQL-Code:
declare @Table table (id int, wert int, cnt int)
insert into @Table
select id, wert, count (*) as cnt from test group by id,wert

select distinct id, cnt
  from @Table x
  where x.cnt = (
  select max (cnt) from @Table y where x.id = y.id
  )
order by 1
"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
 
#6

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

  Alt 3. Feb 2009, 18:58
Und wo sind jetzt die Tage
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

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

  Alt 3. Feb 2009, 20:12
Zitat von braini4c:
In diesem falle also:
ID erg
1 3
2 1
3 2
Wollte er die auch?

[edit]Fragezeichen eingefügt---[/edit]
"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
 
#8

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

  Alt 3. Feb 2009, 20:21
Achso, ich dachte bezogen auf das aktuelle Datum.
  Mit Zitat antworten Zitat
braini4c

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

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

  Alt 3. Feb 2009, 21:58
Hallo,

erstmal vielen Danke für die Antworten. Leider scheint es noch nicht richtig zu funktionieren.

@omata: deinen Code habe ich nach >1h laufzeit abgebrochen (habe etwa 12000 ID's mit je etwa 10 Tage Daten), kann also nicht sagen ob es funktioniert. (Es lief auf dem localhost des servers, der zugegeben nicht der schnellste ist, aber dauert das wirklich so lange??)

@alzaimar: leider bringt mir der Query Browser beim ausführen des codes den fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) as cnt
from table1
group by id,wert
) x
where x.' at line 3

leider konnte ich nicht sehen woran es genau liegt. Hast Du eine Idee?

Nur um nochmal klarzumachen was ich möchte:
Im prinzip will ich wissen wielange (=seit wieviel Tagen) hat sich der 'wert' pro 'ID' NICHT geändert.

alternativ habe ich mir schon überlegt einen unique key auf den wert und die ID zu setzen... dann passiert nichts beim Insert into und es wird kein neuer Datensatz eingefügt mit neuem Datum... Dann wäre es einfach eine suche "where Date>'xy' and date<'xyz'"

Mfg
Julian
  Mit Zitat antworten Zitat
omata

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

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

  Alt 3. Feb 2009, 22:11
Meine Abfrage greift ja auch sehr oft auf deine Tabelle. Hast du da keinen Primärschlüssel definiert?

Naja, meine Abfrage ist recht komplex. Ich habe wohl nicht wirklich verstanden, was du da eigentlich haben möchtest und wohl zu kompliziert gedacht.

Aber vielleicht ist die Abfrage von alzaimar ja das was du haben möchtest...

Entferne mal die insinnigen Leerzeichen hinter den Funktionsnamen...
SQL-Code:
select distinct id, cnt
from (select id, wert, count(*) as cnt
      from tabelle1
      group by id,wert) x
where x.cnt = (select max(cnt)
               from (select id, wert, count(*) as cnt
                     from tabelle1
                     group by id, wert) y
               where y.id = x.id)
order by 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:40 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