AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Harte SQL-Nuss - Abfrage formulieren
Thema durchsuchen
Ansicht
Themen-Optionen

Harte SQL-Nuss - Abfrage formulieren

Ein Thema von Tonic1024 · begonnen am 10. Nov 2003 · letzter Beitrag vom 14. Nov 2003
Antwort Antwort
Seite 2 von 2     12   
darkstone

Registriert seit: 4. Feb 2003
26 Beiträge
 
#11

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 10. Nov 2003, 12:52
Hi Tonic

Ich denke, dass mit Datumseingrenzungen nicht der gewünschte Effekt erzielt werden kann - damit wird man nicht die Einträge zu einem Event bekommen. Hast du die Möglichkeit in die Table eine zusätzliche Spalte einzufügen ? - wenn ja, dann vergib doch bei jedem Start eine "Eventnummer" - jeder Eintrag, der zu dem Event gehört, bekommt diese Nummer - Danach kann man dann einfach selektieren...
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#12

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 10. Nov 2003, 13:02
Moin darkstone...

Die Idee ist gut, leider passt sie nicht auf mein Problem...

Nee, im Ernst, würde ich gerne machen... Aber die Datenzätze werden von 'zig einzelnen kleinen Bordcomputern (Außendienst) erzeugt. Damit das nicht alles durcheinander läuft sorgt ein Einlese-Server für Ordnung.

Diese ollen BC's sind aber strunzen dämlich. Die legen für dieses Event zwischen 2 und x Datensäte an. zu erkennen an einem Start-Datensatz und einem Ende-Datensatz.

Wer dich das ausgedacht hat...

Jeder einzelne Datensatz hat aber mit dem Event selbst nichts zu tun, außer dass er innerhalb des selben zeitraums wie der Event gewesen ist. Pseudo-Primärschlüssel ist somit Datum/Uhrzeit kombiniert.

Ich stehe vor einem ausgewachsenen problem...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Christof

Registriert seit: 15. Jan 2003
Ort: Saarland
97 Beiträge
 
Delphi 2005 Architect
 
#13

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 08:31
Hallo,
versuche doch mal

SQL-Code:
SELECT * FROM TABELLE WHERE beginnzeit BETWEEN
(SELECT DISTINCT beginnzeit AS Beginn FROM DieSelbeTabelle WHERE code = x) AND
(SELECT DISTINCT beginnzeit AS Ende FROM DieSelbeTabelle WHERE code = y);

Gruss

Christof
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#14

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 08:58
Da wirst du mit Ansi-SQL nicht weiter kommen.

Das Problem ist, das Du in der Abfrage selber eine gewisse Logik benötigst, die sich durch reines SQL nicht abbilden lässt.

Prinzipiell sieht Deine Abfrage so aus:

Hole alle Anfangszeiten
für jeden Datensatz in dieser Abfrage:
- hole zugehörigen Endzeitpunkt
- hole dazwischen liegende daten

und an der zweiten Zeile scheiterst Du.

(Das mit dem zugehörigen Endzeitpunkt deswegen weil es theoretisch sein kann, daß sich Zeitbereiche überschneiden. Beispiel: 1. 09:00 Uhr - 12:00 Uhr, 2. 11:45 Uhr bis 13:00 Uhr. Auch wenn das vielleicht praktisch nicht so vorkommen kann, so wie Du das Datenmodell beschrieben hast ist es möglich und sollte entsprechend auch behandelt werden können.)

Das ganze lässt sich über Transact-SQL z.b. beim MS SQL - Server abbilden, bei Oracle geht das auch mit servergespeicherten Prozeduren. Ob das mit Interbase abbildbar ist weiss ich leider nicht.

Ansonsten müsstest Du diese Schleife tatsächlich programmatisch abbilden,
also erstmal alle End- und Startzeitpunkte selektieren, die jeweils zusammengehörigen raussortieren und dann pro Bereich eine einzelne between-Abfrage loslassen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 09:30
Ist anhand von "Code" zu erkennen welchem ereignis es gehört.
Oder ist es nur eine sequence-generierte Zahl.

Welche Spalten hat deine Tabelle?
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#16

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 10:39
Moin...

@Christof
Damit würde zwar die Abfrage funktionieren, aber mein Problem nicht gelöst...

@phoenix
Genau das ist es... Soweit war ich mittlerweile auch gekommen.

Das mit dem Endzeitpunkt ist zwar richtig, aber zu vernachlässigen. Das mit dem Server war nur als vergleich gedacht. Und analog zu diesem Beispiel müsste er erst wieder repariert werden, bevoer er erneut ausfallen könnte. Gottseidank hat die Informatik keine Gewalt über die Physik

eine Zweite Abfrage kann ich aus Programm-technischen Gründen nicht starten. Es wird ein Modul für eine Software die diesen Fall nicht vorsieht.

Meine Überlegung ging dahin, dass ich mit den Sub-Querys ja je eine Tabelle erzeuge. Die wollte ich joinen lassen und dann selektieren. Bin aber auch da gescheitert...(werd aber weiter versuchen) Könnte sein, dass die SQL damit wirklich überfordert ist...

@GeorgeW
ich habe ServerID, Datum, Uhrzeit von, Uhrzeit bis, EreignisID, EreignisBeschreibungID, EreignisInfoID

Ein bestimmtes Ereignis begrenzt viele andere Ereignisse.
Quasi so: (wieder das Server-Beispiel - Multitasking beherrscht dieser Server nicht!)
Code:
Gerät4, 22.2.2002, 22:22, 22:23, Mail Ereigniss, Mailbewegung, Mail eingegangen
Gerät4, 22.2.2002, 22:23, 22:26, Mail Ereigniss, Neue Mail erstellt, NULL
Gerät4, 22.2.2002, 22:26, 22:26, System Ereignis, Ausfall, Fehler aufgetreten
Gerät4, 22.2.2002, 22:26, 22:28, Virus Ereignis, AV-Update durchgeführt, NULL
Gerät4, 22.2.2002, 22:28, 22:32, Mail Ereigniss, Mailbewegung, Mail ausgegangen
Gerät4, 22.2.2002, 22:32, 22:32, System Ereignis, Ausfall, Fehler behoben
gibt noch mehr Felder, die damit in keinem Zusammenhang stehen. Key ist eine autoincrement ID.

Interessant ist für mich der Ausfall und alles was zwischen Beginn und Ende passiert ist.

BTW: es gibt auch mehr als nur ein Gerät, aber soll nicht das Problem sein...

bis denne...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Christof

Registriert seit: 15. Jan 2003
Ort: Saarland
97 Beiträge
 
Delphi 2005 Architect
 
#17

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 14:23
Hallo,

also ich glaube nicht das das mit einem SQL Kommando realisierbar ist. Eine Möglichkeit sind StoredProcedure auf dem SQL Server. Damit geht so etwas, oder mit einem View damit geht auch so etwas.

Ich kenne die Systemumgebung nicht ob so etwas bei dir möglich ist.


Gruss

Christof
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#18

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 13. Nov 2003, 14:59
Falls du für den Zeitraum jedes Ereignisses alle anderen zum gleichem Zeitraum haben willst.
Kannst du das hier versuchen.
Ich verwende eine Oracle DB - es kann deshalb sein, dass einige Sachen bei dir nicht funktionieren.

SQL-Code:
SELECT ev_a.device,
       ev_a.ev_descr Description,
       ev_a.ev_info info,
       decode(ev_a.ev_action, 'NULL', 'keine Aktion', ev_a.ev_action) action,
       ev_a.ev_date event_date,
       ev_a.ev_st_tm start_time,
       ev_a.ev_en_tm end_time,
       ev_b.device "conc. Device",
       rpad(ev_b.ev_descr, 20, ' ') || ': ' || rpad(ev_b.ev_info, 25, ' ') ||
       ' - ' || decode(ev_b.ev_action, 'NULL', 'keine Aktion', ev_b.ev_action) "conc. Event",
       ev_b.ev_st_tm || ' - ' || ev_b.ev_en_tm "Time"
FROM (SELECT t.device,
               t.ev_descr,
               t.ev_info,
               t.ev_action,
               t.ev_date,
               t.ev_st_tm,
               t.ev_en_tm,
               to_date(to_char(t.ev_date, 'dd.mm.yyy') || ' ' || t.ev_st_tm,
                       'dd.mm.yyyy hh24:mi') st_dttm,
               to_date(to_char(t.ev_date, 'dd.mm.yyy') || ' ' || t.ev_en_tm,
                       'dd.mm.yyyy hh24:mi') en_dttm,
               ROWID
        FROM [TABELLE] t) ev_a,
       (SELECT t.device,
               t.ev_descr,
               t.ev_info,
               t.ev_action,
               t.ev_date,
               t.ev_st_tm,
               t.ev_en_tm,
               to_date(to_char(t.ev_date, 'dd.mm.yyy') || ' ' || t.ev_st_tm,
                       'dd.mm.yyyy hh24:mi') st_dttm,
               to_date(to_char(t.ev_date, 'dd.mm.yyy') || ' ' || t.ev_en_tm,
                       'dd.mm.yyyy hh24:mi') en_dttm,
               ROWID
        FROM [TABELLE] t) ev_b
WHERE (EV_B.st_dttm BETWEEN ev_a.st_dttm AND ev_a.en_dttm OR
       EV_B.en_dttm BETWEEN ev_a.st_dttm AND ev_a.en_dttm) AND
       ev_a.ROWID != ev_b.ROWID
ORDER BY ev_a.device,
          ev_a.st_dttm,
          ev_a.ev_action,
          ev_b.st_dttm


Ich nahm die Werte die du gepostet hast und habe diese Spalten erstellt:
device varchar2(20)
ev_date date
ev_st_tm varchar2(5)
ev_en_tm varchar2(5)
ev_descr varchar2(100)
ev_info varchar2(100)
ev_action varchar2(100)



Damit erhältst du halt eine Übersicht.

Aber ich glaube ich habe dein Problem nicht ganz verstanden.

Außer es geht um debugging der DB (du schriebst Systemausfall, Virusbefall)


Robert
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#19

Re: Harte SQL-Nuss - Abfrage formulieren

  Alt 14. Nov 2003, 08:56
Moin...

Danke, ich werds probieren. Aber ich komme dies Wochenende nich mehr dazu... vorübergehende Umorientierung des Projektziels... Es gibt immer Leute die wichtiger sind als Andere

Das Problem liegt mir aber immer noch am Herzen... nächste Woche werd ich mal wieder ein paar Stündchen abzwacken...

Es geht eigentlich nur darum aus einer langen Tabelle einen Block von einem Start-Datensatzt bis zu einem Ende-Datensatz auszulesen - egal was drin steht. Dann weiter unten in der Tabelle, wenn wieder ein Start-Datensatzt kommt weiterlesen und beim Ende-Datensatz aufhören.

Das Problem ist ja, dass das DBMS für jeden Datensatz schaut ob die Bedingung zutrifft oder nicht. Ich will aber ja alle Datensätze (als Block) haben die Zwischen zwei Datensätzen stehen. Und das nicht nur einmal sondern sooft wie eine Start-Daten-Ende Kombinationen vorkommen.

Das Beispiel mit dem Server habe ich nur gebracht, weil das reale Thema viel zu umfangreich und abstrakt ist - selbst für mich . In der Tat ist es aber eine Art Logfile, dass wie oben geschildert ist aufgebaut ist.

Danke erstmal...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  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 03:20 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