Ankündigung

Einklappen
Keine Ankündigung bisher.

Join - Distinct - Abfrage mit Sortierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Join - Distinct - Abfrage mit Sortierung

    Hallo Leute,

    ich komme zur Zeit bei einer SQL-Abfrage nicht weiter. Meine Tabelle enthält folgende Spalten: cnumber (int), date (timestamp)

    in cnumber können sich die Einträge doppeln, jeweils mit anderer timestamp. Beispiel:

    id cnumber date
    6 123456 1340720422
    5 444444 1340720111
    4 064536 1340710014
    3 123456 1340707841
    2 444444 1340658741
    1 000001 1340155414

    Ich möchte nun erreichen, dass ich als Ausgabe folgendes bekomme:

    6 123456 1340720422
    5 444444 1340720111
    4 064536 1340710014
    1 000001 1340155414

    Also nur die zeitlich letzten Einträge zu einer cnumber und diese nach Zeit sortiert.

    Wie erreiche ich das? Meine bisherigen Versuche resultieren immer in doppelten Ergebnissen zu einer cnumber.

    Vielen Dank!

  • #2
    Zitat von Dublay Beitrag anzeigen
    Hallo Leute,

    ich komme zur Zeit bei einer SQL-Abfrage nicht weiter. Meine Tabelle enthält folgende Spalten: cnumber (int), date (timestamp)

    in cnumber können sich die Einträge doppeln, jeweils mit anderer timestamp. Beispiel:

    id cnumber date
    6 123456 1340720422
    5 444444 1340720111
    4 064536 1340710014
    3 123456 1340707841
    2 444444 1340658741
    1 000001 1340155414

    Ich möchte nun erreichen, dass ich als Ausgabe folgendes bekomme:

    6 123456 1340720422
    5 444444 1340720111
    4 064536 1340710014
    1 000001 1340155414

    Also nur die zeitlich letzten Einträge zu einer cnumber und diese nach Zeit sortiert.

    Wie erreiche ich das? Meine bisherigen Versuche resultieren immer in doppelten Ergebnissen zu einer cnumber.

    Vielen Dank!

    Code:
    test=*# select * from dublay;
     id | cnumber |    date
    ----+---------+------------
      6 |  123456 | 1340720422
      5 |  444444 | 1340720111
      4 |   64536 | 1340710014
      3 |  123456 | 1340707841
      2 |  444444 | 1340658741
      1 |       1 | 1340155414
    (6 rows)
    
    Time: 0,205 ms
    test=*# select distinct on (cnumber) id, cnumber, date from dublay order by cnumber, date desc;
     id | cnumber |    date
    ----+---------+------------
      1 |       1 | 1340155414
      4 |   64536 | 1340710014
      6 |  123456 | 1340720422
      5 |  444444 | 1340720111
    (4 rows)
    Davon abgesehen scheinst Du komische Datentypen für CNUMBER und DATE zu verwenden.


    Andreas

    Kommentar


    • #3
      mh, sowas hier?
      PHP-Code:
      SELECT idcnumberdate FROM new GROUP BY cnumber ORDER BY date DESC 
      new durch tabellenname ersetzen

      @Andreas - da hatteste ja schon was geschrieben - voll verrissen ^_^ aber komme auf das Selbe ergebnis, jedenfalls laut seiner Vorgabe.

      Gruß André

      Kommentar


      • #4
        Danke schon mal für Eure Lösungen, doch leider liefern beide nicht das, was ich gerne hätte. Aber ich habe auch in meiner Fragestellung einen wesentlichen Punkt vergessen:

        Ich würde nämlich auch gerne zählen lassen, wie viele Einträge es zu einer "cnumber" gibt, sprich die Ausgabe müsste wie folgt aussehen, sortiert nach date absteigend:

        Code:
        id     cnumber    date     count
        6 123456 1340720422    2
        5 444444 1340720111    2
        4 064536 1340710014    1
        1 000001 1340155414    1
        Das ist bei meiner Fragestellung irgendwie untergegangen, sorry.

        Kommentar


        • #5
          Setze dich erst einmal mit SQL-Grundlagen auseinander.

          count(feld) zählt die Einträge.
          akretschmers Lösung ist daher für dein Vorhaben nicht gut.

          PHP-Code:
          select idcnumberdatecount(cnumberfrom tabelle group by cnumber order by date desc 
          Dabei hattest du schon die Antwort gegeben.

          Kommentar


          • #6
            Zitat von Dublay Beitrag anzeigen
            Danke schon mal für Eure Lösungen, doch leider liefern beide nicht das, was ich gerne hätte. Aber ich habe auch in meiner Fragestellung einen wesentlichen Punkt vergessen:

            Ich würde nämlich auch gerne zählen lassen, wie viele Einträge es zu einer "cnumber" gibt, sprich die Ausgabe müsste wie folgt aussehen, sortiert nach date absteigend:

            Code:
            id     cnumber    date     count
            6 123456 1340720422    2
            5 444444 1340720111    2
            4 064536 1340710014    1
            1 000001 1340155414    1
            Das ist bei meiner Fragestellung irgendwie untergegangen, sorry.
            Ja, wo ist da das Problem?

            Code:
            test=# select distinct on (cnumber) id, cnumber, date, count(*) over (partition by cnumber) from dublay order by cnumber, date desc;
             id | cnumber |    date    | count
            ----+---------+------------+-------
              1 |       1 | 1340155414 |     1
              4 |   64536 | 1340710014 |     1
              6 |  123456 | 1340720422 |     2
              5 |  444444 | 1340720111 |     2
            (4 rows)

            Andreas

            Kommentar


            • #7
              Das geht schon etwas über die Grundlagen hinaus, denn mit einem simplen ORDER BY kommt man hier nicht weiter.

              Hier wird es erklärt: http://dev.mysql.com/doc/refman/5.0/...group-row.html

              Edit: akretschmer einfach ignorieren, es sei denn du arbeitest tatsächlich mit PostgreSQL

              Kommentar


              • #8
                Danke fab, das schau ich mir mal an.

                Grüße,

                Dublay

                Kommentar


                • #9
                  Zitat von fab Beitrag anzeigen
                  Das geht schon etwas über die Grundlagen hinaus, denn mit einem simplen ORDER BY kommt man hier nicht weiter.

                  Hier wird es erklärt: http://dev.mysql.com/doc/refman/5.0/...group-row.html

                  Edit: akretschmer einfach ignorieren, es sei denn du arbeitest tatsächlich mit PostgreSQL

                  naja, eigentlich ist es damit schon getan

                  PHP-Code:
                  SELECT count(*) AS anzahl,idcnumberdate FROM new GROUP BY cnumber ORDER BY date DESC 
                  anzahl id cnumber date
                  2 6 123456 1340720422
                  2 5 444444 1340720111
                  1 4 064536 1340710014
                  1 1 000001 1340155414

                  Kommentar


                  • #10
                    Nein, damit bekommst du nicht das jeweils größte Datum, das einzige was du erreichst ist dass die Zeilen in der Ausgabe nach der "date"-Spalte sortiert werden. Welcher Datensatz aber für jede Gruppierung ausgewählt wird, folgt hier keiner Regel.

                    Kommentar


                    • #11
                      Na vielleicht wars ja auch einfach nur Glück, dass beim testen immer das richtige ergebnis kam bin halt ein sonntagskind ^_^
                      wobei ich eher denke, dass es damit zusammen hängt, in welcher reihenfolge die daten in der tabelle stehen, den dann ist es kein zufall mehr welches datum genommen wird.

                      Kommentar


                      • #12
                        Zitat von kurty Beitrag anzeigen
                        wobei ich eher denke, dass es damit zusammen hängt, in welcher reihenfolge die daten in der tabelle stehen, den dann ist es kein zufall mehr welches datum genommen wird.
                        Du irrst, ohne genaue Angabe, was wie zu sortieren ist gibt es KEINE Garantie, wie das rauspurzelt. Da reicht es aus, daß Algorithmen in einer anderen Version anders arbeiten. Es ist völlig rille, was DU als 'Reihenfolge in der Tabelle' vermutest.

                        Andreas

                        Kommentar


                        • #13
                          PHP-Code:
                          select idcnumbermax(date), count(cnumberfrom tabelle group by cnumber order by date desc 

                          Kommentar


                          • #14
                            Auch falsch. So bekommst du zwar Maximum und Anzahl aber nicht die richtige id

                            Kommentar

                            Lädt...
                            X