Announcement

Collapse
No announcement yet.

Zeilen mit gleichem Eintrag

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeilen mit gleichem Eintrag

    Hallo,
    ich habe folgende Tabelle:


    Code:
    Start_Zeit              End_Zeit                Zeit_diff[s]       Gruppe
    -------------------------------------------------------------------------------------------
    19.12.2007 13:12:42	19.12.2007 13:17:07	265                RBG03
    20.12.2007 08:22:20	20.12.2007 08:31:15	535                a50
    20.12.2007 08:26:57	20.12.2007 08:33:59	422                a50
    20.12.2007 12:15:49	20.12.2007 12:24:19	510                a37,5
    08.01.2008 10:58:11	08.01.2008 11:03:01	290                a50
    usw......

    Es handelt sich hierbei um eine Auflistung von Störungen. Sollte es vorkommen, das sich Störungen aus der gleichen Gruppe (es gibt ca. 150 verschiedene Gruppen) zeitlich "überlappen", wie hier in Zeile 2 und 3, möchte ich die Zeitdifferenz vom Beginn der ersten Störung bis zum Ende der zweiten (bzw. letzten) Störung ausgegeben bekommen. Sollte keine "überlappung" da sein, so soll einfach nur die Zeitdifferenz der Störung zurückgegeben werden.

    Ich stehe leider komplett auf dem Schlauch. Wäre super, wenn jemand ne Idee hat. Schonmal Danke im voraus.

    Viele Grüße
    Sascha

  • #2
    Also für den Fall, dass sie sich nicht üpperlappen hätte ich erstmal was:

    select x.Zeit_diff from Tabelle x
    where not exists
    (select * from Tabelle where Tabelle.Gruppe=x.Gruppe
    and (Tabelle.Start_Zeit between x.Start_Zeit and x. End_Zeit
    or Tabelle.End_Zeit between x.Start_Zeit and x.End_Zeit))

    den zweiten Select könntest Du dann mit Union verbinden.
    Vielleicht fällt mir später dazu etwas ein

    Gtuß frauwue
    Zuletzt editiert von frauwue; 09.01.2008, 16:30. Reason: Klammer auf falsch
    docendo discimus

    Comment


    • #3
      Hallo frauwue,
      das ist auf jedenfall schonmal ein Ansatz. Danke.

      Um das mit der Überlappung hinzubiegen bin gerade dabei mir etwas mit Hilfe von zwei Cursorn zu basteln...
      Das steht allerdings noch auf ziemlich wackeligen Füßen. Bin also immer noch dankbar für jeden Vorschlag.

      Comment


      • #4
        Auch auf die Gafahr hin mich hier vollkommen zu blamieren :-),
        stelle ich mal meinen bisher erarbeiteten Code rein.
        Ich habe es zu Testzwecken erstmal so geschrieben, das bei einer Überlappung der Zeiten zur Übersicht ein "ja" ausgegeben wird und für den Fall das sich die Zeiten nicht überlappen wird die jeweilige Zeitdifferenz der Störung ausgegeben. (Damit man sich orientieren kann an welcher Stelle der Tabelle man sich gerade befindet)

        Code:
        declare Zeit_Cursor scroll cursor
        for select Start_Zeit, End_Zeit, Zeit_Diff, Gruppe from dbo.Stoerung;
        
        declare Zeit_Cursor2 scroll cursor
        for select Start_Zeit, End_Zeit, Zeit_Diff, Gruppe from dbo.Stoerung;
        
        declare @start_zeit1 datetime
        declare @end_zeit1 datetime
        declare @zeit_diff1 int
        declare @gruppe1 varchar(10)
        
        declare @start_zeit2 datetime
        declare @end_zeit2 datetime
        declare @zeit_diff2 int
        declare @gruppe2 varchar(10)
        
        open Zeit_Cursor;
        open Zeit_Cursor2;
        
        
        fetch absolute 2 from Zeit_Cursor2 into @start_zeit2, @end_zeit2, @zeit_diff2, @gruppe2
        fetch first from Zeit_Cursor into @start_zeit1, @end_zeit1, @zeit_diff1, @gruppe1
        while @@fetch_status = 0
        begin
        if @start_zeit2 < @end_zeit1 and @gruppe1 = @gruppe2
        begin
        	print 'ja'
        	fetch next from Zeit_Cursor2 into @start_zeit2, @end_zeit2, @zeit_diff2, @gruppe2
        	fetch next from Zeit_Cursor into @start_zeit1, @end_zeit1, @zeit_diff1, @gruppe1
        end
        else
        begin
        	print @zeit_diff1
        end
        	fetch next from Zeit_Cursor2 into @start_zeit2, @end_zeit2, @zeit_diff2, @gruppe2
        	fetch next from Zeit_Cursor into @start_zeit1, @end_zeit1, @zeit_diff1, @gruppe1
        
        end
        
        
        
        close Zeit_Cursor;
        close Zeit_Cursor2;
        
        deallocate Zeit_Cursor;
        deallocate Zeit_Cursor2;
        Das ganze soll so Funktionieren das ich zwei Cursor habe die jeweils um eine Zeile versetzt sind.
        Das Problem liegt im Moment darin, das der letzte Wert immer ein "ja" ist, weil der Zeit_Cursor2 sobald er am Ende der Tabelle ist den letzten Wert speichert.
        Im nächsten Schritt liest dann der Zeit_Cursor1 ebenfalls diese letzte Zeile ein. Somit haben beide Cursor den gleichen Wert und es wird immer ein "ja" ausgegeben.

        Hat jemand ne Idee wie ich das Problem Lösen kann?

        Gruß Sascha

        Comment


        • #5
          Hi,
          wenn Du das ganze per Programm lösen willst,
          solltest Du in etwa folgendermaßen vorgehen:

          Du definierst Dir drei Programmvariablen für Start, Ende und Gruppe (st1,e1,g1).
          Du definierst nur einen Select-Cursor sortiert zuerst nach Gruppe, dann nach Startzeit.
          Vom ersten Datensatz speicherst Du Anfang und Ende und Gruppe nach (st1,e1,g1).
          Dann durchläufst Du die weiteren Sätze in einer Schleife.

          Innerhalb der Schleife machst Du folgendes:
          Fall a)
          Falls die aktuelle gefundene Gruppe = g1 ist und die Startzeit <=e1 und die Endzeit>e1:
          dann ersetzt Du e1 durch Die aktuelle Endzeit.
          b)
          Falls Du eine neue Gruppe findest, oder die Startzeit ist größer als e1,
          gibst Du aus: g1 und e1-st1
          Dann speicherst Du die Werte des aktuellen Satzes in die Variablen st1,e1 und g1.


          Nach dem Schleifenende machst Du dann nochmal eine Ausgabe g1 und e1-st1

          Gruß frauwue
          Zuletzt editiert von frauwue; 10.01.2008, 00:24.
          docendo discimus

          Comment


          • #6
            Hallo,
            vielen Dank für den Tipp. Habs mit ein paar modifikationen hinbekommen.

            Für den Fall das jemand mal was ähnliches machen muss/will hier der grobe Code:

            Code:
            declare @start_zeit datetime
            declare @end_zeit datetime
            declare @gruppe varchar(10)
            declare @s datetime
            declare @e datetime
            declare @g varchar(10)
            
            declare Zeit_Cursor scroll cursor
            for select Gruppe, Start_Zeit, End_Zeit from dbo.Stoerung
            
            open Zeit_Cursor
            
            fetch first from Zeit_Cursor into @gruppe, @start_zeit, @end_zeit
            set @g = @gruppe
            set @s = @start_zeit
            set @e = @end_zeit
            while @@fetch_status = 0
            begin
            	print @s
            	print @e
            	print @g
            
            	fetch next from Zeit_Cursor into @gruppe, @start_zeit, @end_zeit
            
            		if (@@fetch_status != 0) goto while_end
            
            		else if @g != @gruppe or @start_zeit > @e
            		begin
            			set @s = @start_zeit
            			set @e = @end_zeit
            			set @g = @gruppe
            		end
            
            		else if @g = @gruppe and @start_zeit < @e
            		begin
            			set @e = @end_zeit
            			print @e
            			print 'e wurde geändert'
            		end
            while_end:	
            end
            
            close Zeit_Cursor
            
            deallocate Zeit_Cursor
            Gruß Sascha

            Comment

            Working...
            X