Announcement

Collapse
No announcement yet.

SELECT/WHERE Problem

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

  • SELECT/WHERE Problem

    Hallo,

    mit folgernder SQL-Abfrage bekomme ich alle Werte mit den Minuten 0 und 30 der letzten zwei Tage beginnend mit 0:00 Uhr:

    Code:
    SELECT * FROM werte WHERE(MINUTE(tStamp) MOD 30)=0 AND tStamp>((NOW()- TIME(NOW()))-INTERVAL 1 DAY)
    Jetzt bekomme ich mehrere Werte für die Minuten und möchte aber nur den ersten Wert haben. Wie bekomme ich das hin?

    Ich bekomme z.B.
    Code:
    0:00:01    143
    0:00:31    253
    0:00:55    728
    0:30:00    232
    0:30:02    632
    0:30:48    998
    1:00:29    232
    ...
    und möchte nur folgende Ausgabe:
    Code:
    0:00:01    143
    0:30:00    232
    1:00:29    274
    ...
    Leider sind die Sekunden immer unterschiedlich und kann nicht nur die Datensätze mit Sekunde 00 herausfiltern.

    Vielleicht wäre es ja eine möglichkeit auf den letzten Wert der Ausgabe zurückzugreifen. Habe aber keine Möglichkeit dazu gefunden. Also eine irgendwas im WHERE Teil wie "minute != letzterDatensatz(Minute)"

    Notfalls müsste ich dann die Abfrage so lassen und in meinem Programm die unerwünschten Einträge entfernen lassen. Aber warum sollte ich Werte abfragen die ich garnicht benötige?

    Hoffe jemand hat dazu eine Idee.

    Gruß
    Ingo
    Zuletzt editiert von IngoF; 30.12.2009, 17:35.

  • #2
    Hi,

    sowas in der Art?

    [highlight=sql]
    SELECT DISTINCT (
    CONCAT( MINUTE( time ) , HOUR( time ) )
    ), time
    FROM time
    WHERE (
    MINUTE( time ) MOD30
    ) =0
    AND time > ( (
    NOW( ) - TIME( NOW( ) ) ) - INTERVAL 1
    DAY
    )
    [/highlight]
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Hallo,

      Danke für die Antwort,

      allerdings bin ich da nicht viel weiter als vorher...
      Hatte meine SQL etwas gekürzt damit man nicht zuviel scrollen musste.
      Also hier mal meine komplette SQL:
      Code:
      SELECT *
      FROM emslog.080018
      WHERE timestamp>((NOW()- TIME(NOW()))-INTERVAL 1 DAY)
      AND (MINUTE(timestamp)MOD 30) =0
      Wenn ich Deine SQL-Abfrage nehme und alle Spalten hinter dem Distinct angebe die ich benötige kommt genau das selbe Ergebnis wie bei meiner Anfrage. Allerdings akzeptiert mein MySQL die Zeilen 8 bis 11 nicht mehr.

      Als Ausgabe kommt dann:
      Code:
      2009-12-28 0:00:01  ...............
      2009-12-28 0:00:05  ...............
      2009-12-28 0:00:13  ...............
      2009-12-28 0:00:23  ...............
      2009-12-28 0:00:42  ...............
      2009-12-28 0:00:45  ...............
      2009-12-28 0:00:46  ...............
      2009-12-28 0:00:47  ...............
      2009-12-28 0:00:56  ...............
      2009-12-28 0:30:04  ...............
      2009-12-28 0:30:09  ...............
      Die Daten sind natürlich gekürzt. Teilweise sind es bis 46 Einträge pro Minute. Also eigentlich etwa 45 überflüssige Datensätze

      Ich möchte also für das Datum und Uhrzeit jeweils einen Wert Zeile haben. Also 96 Zeilen für 2Tage.

      Gruß
      Ingo

      P.S.: Wie fügt man denn den SQL-Code ein? Ich habe nur eine Schaltfläche für "CODE einfügen"
      Zuletzt editiert von IngoF; 30.12.2009, 22:50. Reason: tippfehler

      Comment


      • #4
        Vielleicht hilft das weiter:

        +------+---------------------------------------------+-----------------+
        | id | zeit | hour(zeit) | minute(zeit) | second(zeit) |
        +------+------------+--------------+----------------+----------------+
        | 0 | 22:48:50 | 22 | 48 | 50 |
        | 0 | 22:48:59 | 22 | 48 | 59 |
        +------+---------- --+-------------------------------+----------------+
        2 rows in set (0.00 sec)

        mysql> select id,zeit,hour(zeit),minute(zeit),second(zeit) from test where hour(zeit)=22 and minute(zeit)=48 and second(zeit)>=50;
        Zuletzt editiert von mtth; 31.12.2009, 00:10.

        Comment


        • #5
          Danke für den Hinweis,

          Das Problem ist nur dass es viele Minuten gibt bei der es keinen Datensatz mit Sekunde 0 gibt. Manchmal ist der erste Eintrag mit Sekunde 1 oder größer.

          Kann also nicht nach einem bestimmten Sekundenwert filtern oder suchen. Da die Sekunden Zufallswerte sind.

          Gruß
          Ingo

          Comment


          • #6
            Hallo Ingo,
            hab den Eintrag nochmal aktualisiert.
            Mit der Abfrage kannst Du jeden gewünschten Datum/Zeiteintrag herausfiltern

            Comment


            • #7
              Hab auch aktualisiert

              kann leider nicht nach einer festen Sekundenzahl suchen weil die Sekunden zufällig sind und ich leider wirklich nach dem ersten Eintrag suchen muss...

              Gruß
              Ingo

              Comment


              • #8
                Eine Frage:
                Warum bekommst Du mehrere Werte in einer Minute, wenn Du nur einen pro Minute haben willst?
                Zuletzt editiert von mtth; 31.12.2009, 00:58.

                Comment


                • #9
                  DANKE.... Du hast mich zur (fast) Lösung meines Problems geführt.
                  Allerdings funktioniert Deine Lösung nicht so ganz.

                  Hier meine SQL-Abfrage:
                  Code:
                  SELECT *,min(second(timestamp))
                  FROM emslog.080018
                  WHERE (Minute(timestamp)=0
                  OR minute(timestamp)=3
                  OR minute(timestamp)=6
                  OR minute(timestamp)=9
                  OR minute(timestamp)=12
                  OR minute(timestamp)=15
                  OR minute(timestamp)=18
                  OR minute(timestamp)=21
                  OR minute(timestamp)=24
                  OR minute(timestamp)=27
                  OR minute(timestamp)=30
                  OR minute(timestamp)=33
                  OR minute(timestamp)=36
                  OR minute(timestamp)=39
                  OR minute(timestamp)=42
                  OR minute(timestamp)=45
                  OR minute(timestamp)=48
                  OR minute(timestamp)=51
                  OR minute(timestamp)=54
                  OR minute(timestamp)=57)
                  AND (timestamp>((NOW()- TIME(NOW()))-INTERVAL 2 DAY))
                  GROUP BY
                  Year(timestamp), month(timestamp), dayofmonth(timestamp)
                  , hour(timestamp), minute(timestamp)
                  Allerdings klappt das WHERE (Minute(timestamp) MOD 30) nicht mehr. bei einer halben Stunde geht das ja noch aber wenn ich jetzt alle 2 Minuten filtern möchte müsste ich alle Minuten mit ODER extra angeben.

                  Vielleicht hat ja noch jemand eine Idee....

                  Gruß
                  Ingo
                  Zuletzt editiert von IngoF; 31.12.2009, 01:36.

                  Comment


                  • #10
                    Vielleicht kannst Du mal einen Auszug der Tabelle geben(die ersten 10 Zeilen), dann kann man besser verstehen und ausprobieren.
                    Zuletzt editiert von mtth; 31.12.2009, 01:40.

                    Comment


                    • #11
                      Wie kann ich denn die Tabelleninhalte kopieren?
                      in dem CMD-Fenster kann ich nicht kopieren und im Query-Browser auch nicht.

                      und die ersten 100 Zeilen möchte ich nicht abtippen

                      Habe meine funktionierende SQL-Abfrage in der letzten Antwort aktualisiert.
                      Ist dadurch dass das "MOD 30" nicht mehr funktioniert etwas lang.

                      Gruß
                      Ingo

                      Comment


                      • #12
                        Wenn Du eine create table und eine insert Anweisung schreibst und hier einfügst, kann ich mir die Tabelle herstellen und selbst mit Werten füllen und es ausprobieren.

                        Comment


                        • #13
                          Hat sich soeben erledigt...

                          Muss sich wohl vorhin einen Tippfehler eingeschlichen haben. Vermute ich hatte das Leerzeichen zwischen MOD und 30 vergessen....

                          Also hier die bisher beste Lösung für mein Problem:
                          Code:
                          SELECT *,min(second(timestamp))
                          FROM emslog.080018
                          WHERE (MINUTE(timestamp) MOD 30) =0
                          AND (timestamp>((NOW()- TIME(NOW()))-INTERVAL 1 DAY))
                          GROUP BY
                          Year(timestamp), month(timestamp), dayofmonth(timestamp)
                          , hour(timestamp), minute(timestamp)
                          Gruß
                          Ingo

                          Comment

                          Working...
                          X