Announcement

Collapse
No announcement yet.

SQL Wert erhöhen!

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

  • SQL Wert erhöhen!

    Hallo,

    ich habe folgendes Ergebnis einer Abfrage:

    80 39 47 14.06.2013 09:01
    81 51 47
    82 14 47
    83 4 47
    84 4 57
    85 38 47
    86 27 47
    87 27 47


    Ich möchte nun in SQL in der letzten Spalte immer den letzten vorhandenen Wert um 62 min erhöhen!
    Wie mache ich das?

    Gruß

  • #2
    Hallo,
    SQL kennt keinen VORGÄNGER oder NACHFOLGER. Eine bestimmte Reihenfolge ergibt sich immer nur aus einer entsprechenden ORDER BY Klausel. Es kann deshalb keine SQL-Lösung für dein Problem geben. Es sind lediglich - je nach DBMS - proprietäre Lösungen mittels SPs oder Systemvariablen möglich.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hi,
      wäre das auch nicht mit einer Function oder Prozedur zu lösen?
      Bin für jeden Anzatz dankbar :-)
      Was ist mit Lead oder lag?? Nutze eine Oracle 10g Datenbank !
      Gruss

      Comment


      • #4
        Nach Oracle verschoben
        Christian

        Comment


        • #5
          Nur schnell noch ein Beispiel zum Feierabend, evtl. kannst Du einige Anregungen herausnehmen:
          Code:
          WITH data AS
           (SELECT 80 nr, 39 id, to_date('14.06.2013 09:01','DD.MM.YYYY HH24:MI') datum FROM dual UNION ALL
            SELECT 81   , 51   , NULL                                                   FROM dual UNION ALL
            SELECT 82   , 14   , NULL                                                   FROM dual UNION ALL
            SELECT 83   ,  4   , NULL                                                   FROM dual UNION ALL
            SELECT 84   ,  4   , NULL                                                   FROM dual UNION ALL
            SELECT 85   ,  38  , NULL                                                   FROM dual UNION ALL
            SELECT 86   ,  27  , NULL                                                   FROM dual UNION ALL
            SELECT 87   ,  27  , NULL                                                   FROM dual)
            SELECT nr, id, 
                   datum, 
                   row_number() OVER (ORDER BY nr) rownr,
                   to_date('14.06.2013 09:01','DD.MM.YYYY HH24:MI') + (row_number() OVER (ORDER BY nr)-1) * 41/24/60 datneu
              FROM data
             ORDER BY nr;  
          
          
          NR	ID 	DATUM			ROWNR 	DATNEU  
          ---------------------------------------------------------------------
          80	39	14.06.2013 09:01:00	1	14.06.2013 09:01:00
          81	51				2	14.06.2013 10:03:00
          82	14				3	14.06.2013 11:05:00
          83	4				4	14.06.2013 12:07:00
          84	4				5	14.06.2013 13:09:00
          85	38				6	14.06.2013 14:11:00
          86	27				7	14.06.2013 15:13:00
          87	27				8	14.06.2013 16:15:00
          
          8 rows selected.

          Comment


          • #6
            Hallo Jum,

            kannst du mir bitte sagen was das WITH data as macht und wo ich das einsetze? Genauso muss ich das dual mit meiner Tabelle ersetzen und wozu das UNION ALL!
            Kannst du mir einwenig mehr dazu erklären??
            Danke!!

            Ach nochwas das Ergebnis ist ja nicht immer das gleiche sondern kann sich ändern! Ist das ein Problem?

            Gruß

            Comment


            • #7
              So habs soweit verstanden und umgesetzt! Das einzige Problem was ich noch habe :

              to_date('17.06.2013 09:26:15','DD.MM.YYYY HH24:MI:SS') + (row_number() OVER (ORDER BY seq)-1) * 62/24/60 AS datneu

              Hier habe ich ein sich immer änderndes Datum! Wenn ich die Spalte angebe bekomme ich aber nur ein Datensatz zurück!
              a.datum + (row_number() OVER (ORDER BY seq)-1) * 62/24/60 AS datneu



              81 207067 17.06.2013 10:20:41 17.06.2013 10:20:41
              82 207068
              83 207069
              84 207070
              85
              86
              87
              88
              89


              Gruß

              Comment


              • #8
                Wir haben ja nicht Deine Tabellen und Du hast auch kein Testbeispiel mitgeliefert (CREATE TABEL, INSERT,...)
                Das
                Code:
                 WITH data AS
                erstellt mir "passende" Testdaten on-th-fly als Abfrage Subquery Factoring.
                Du kannst diesen Teil weglassen und musst ggf. Tabellenname und Spalten anpassen.
                Für die zweite Frage wäre es doch besser, wenn Du (einfache) Beispieldaten mit dem erwarteten Ergebnis postest.

                Comment


                • #9
                  Das Ergebnis ist ja schon das richtige müsste jetzt nur noch das Datum was du ja fest reingeschrieben hast über den Spaltennamen dynamisch machen!
                  Also statt

                  to_date('17.06.2013 09:26:15','DD.MM.YYYY HH24:MI:SS') + (row_number() OVER (ORDER BY seq)-1) * 62/24/60 AS datneu
                  dann

                  a.datum + (row_number() OVER (ORDER BY seq)-1) * 62/24/60 AS datneu
                  a.Datum ist schon ein Datum mit dem Format 'DD.MM.YYYY HH24:MI:SS'

                  Gruß

                  Comment


                  • #10
                    evtl. so:
                    Code:
                    WITH data AS
                     (SELECT 80 nr, 39 id, to_date('17.06.2013 12:01','DD.MM.YYYY HH24:MI') datum FROM dual UNION ALL
                      SELECT 81   , 51   , NULL                                                   FROM dual UNION ALL
                      SELECT 82   , 14   , NULL                                                   FROM dual UNION ALL
                      SELECT 83   ,  4   , NULL                                                   FROM dual UNION ALL
                      SELECT 84   ,  4   , NULL                                                   FROM dual UNION ALL
                      SELECT 85   ,  38  , NULL                                                   FROM dual UNION ALL
                      SELECT 86   ,  27  , NULL                                                   FROM dual UNION ALL
                      SELECT 87   ,  27  , NULL                                                   FROM dual)
                      SELECT nr, id, 
                             datum, 
                             row_number() OVER (ORDER BY nr) rownr,
                             min(datum)   OVER (ORDER BY 1)  mindat,
                             min(datum)   OVER (ORDER BY 1) + (row_number() OVER (ORDER BY nr)-1) * 41/24/60 datneu
                        FROM data
                       ORDER BY nr; 
                    
                    
                    nr	id	datum			rownr	mindat			datneu
                    -------------------------------------------------------------------------------------
                    80	39	17.06.2013 12:01:00	1	17.06.2013 12:01:00	17.06.2013 12:01:00
                    81	51				2	17.06.2013 12:01:00	17.06.2013 12:42:00
                    82	14				3	17.06.2013 12:01:00	17.06.2013 13:23:00
                    83	4				4	17.06.2013 12:01:00	17.06.2013 14:04:00
                    84	4				5	17.06.2013 12:01:00	17.06.2013 14:45:00
                    85	38				6	17.06.2013 12:01:00	17.06.2013 15:26:00
                    86	27				7	17.06.2013 12:01:00	17.06.2013 16:07:00
                    87	27				8	17.06.2013 12:01:00	17.06.2013 16:48:00
                    Das minimale /erste Datum kann auch in einer extra Unterabfrage gefunden werden, dann wird es evtl. einfacher verständlich.

                    Comment


                    • #11
                      So ist es super klappt Danke Schön :-)

                      Comment


                      • #12
                        Eine Sache hätte ich da noch! Wie kann ich die Spalte datneu nur die Zeit darstellen? Mit to_char geht das ich brauche es aber als Datum!

                        Comment

                        Working...
                        X