Twilo: PostgreSQL 7.4: doppelte Daten ausgeben

Hallo,

wie kann ich ermitteln, für welchen Tag es mehrere Einträge gibt?

Beispiel:
    date    |   time
------------+----------
 2002-01-01 | 00:00:00
 2003-01-01 | 00:00:00
 2006-12-11 | 11:08:37
 2006-12-11 | 11:10:21
 2006-12-31 | 00:00:00
 2006-12-31 | 15:21:32
 2006-12-31 | 17:00:00

ich möchte jetzt als Ergenis 2006-12-11 (da es ein Eintrag für 11:08:37 und ein für 11:10:21 gibt) und 2006-12-31 (da es ein Eintrag für 00:00:00, 15:21:32 und ein für 17:00:00 gibt). 2002-01-01 und 2003-01-01 soll nicht ausgegeben werden, da die Zeit jeweils nur 00:00:00 ist.

psql -U xyz -d xyz -c "SELECT DISTINCT to_char(gueltigab, 'YYYY-MM-DD') AS date, TO_CHAR(gueltigab, 'HH24:MI:SS') AS time, count(gueltigab) FROM xyz GROUP BY gueltigab HAVING count(to_char(gueltigab, 'YYYY-MM-DD')) > 1"

ergibt
    date    |   time   | count
------------+----------+-------
 2002-01-01 | 00:00:00 |   153
 2003-01-01 | 00:00:00 |   153
 2006-12-11 | 11:08:37 |    16
 2006-12-11 | 11:10:21 |    16
 2006-12-31 | 00:00:00 |    18
 2006-12-31 | 15:21:32 |   135
 2006-12-31 | 17:00:00 |     8

wie bekomme ich es hin, dass count soetwas ergibt?
    date    |   time   | count
------------+----------+-------
 2002-01-01 | 00:00:00 |   1
 2003-01-01 | 00:00:00 |   1
 2006-12-11 | 11:08:37 |   2
 2006-12-11 | 11:10:21 |   2
 2006-12-31 | 00:00:00 |   3
 2006-12-31 | 15:21:32 |   3
 2006-12-31 | 17:00:00 |   3

bzw.
    date    | count
------------+-------
 2002-01-01 |   1
 2003-01-01 |   1
 2006-12-11 |   2
 2006-12-31 |   3

zurückgegeben soll dann nur noch
    date    | count
------------+-------
 2006-12-11 |   2
 2006-12-31 |   3

das sollte sich aber mit having regeln lassen, wenn ich die richtige Anzahl ermitteln kann.

ps. Frage ist Daten die Mehrzahl von Datum?

mfg
Twilo

  1. yo,

    aus deinen beschreibungen werde ich nicht ganz schlau, es scheint, als wenn du uns ein paar joins verschweigen würdest, ansonsten könnte ich mir die count ausgabe mit bis zu 153 werten nicht erklären können. versuch doch mal from xyz genauer aufzulösen.

    Ilja

    1. Hallo Ilja,

      aus deinen beschreibungen werde ich nicht ganz schlau, es scheint, als wenn du uns ein paar joins verschweigen würdest, ansonsten könnte ich mir die count ausgabe mit bis zu 153 werten nicht erklären können. versuch doch mal from xyz genauer aufzulösen.

      es handelt sich nur um eine Tabelle - diese Tabelle hat die Spalte gueltigab. Die Tabelle hat aktuell 499 Einträge.

      bei gueltigab gibt es nur 7 verschiedene Werte
      psql -U xxx -d xxx -c "SELECT DISTINCT gueltigab, count(*) AS anzahl FROM xxxx GROUP BY gueltigab;"
            gueltigab      | anzahl
      ---------------------+--------
       2002-01-01 00:00:00 |    153
       2003-01-01 00:00:00 |    153
       2006-12-11 11:08:37 |     16
       2006-12-11 11:10:21 |     16
       2006-12-31 00:00:00 |     18
       2006-12-31 15:21:32 |    135
       2006-12-31 17:00:00 |      8
      (7 Zeilen)

      ich möchte jetzt folgendes Ergebnis
          date    | count
      ------------+-------
       2006-12-11 |   2
       2006-12-31 |   3

      d.h. das Datum 11.12.2006 und 31.12.2006 taucht mit unterschiedlichen Uhrzeiten auf.

      ps. die minimale Uhrzeit muss nicht 00:00:00 sein

      mfg
      Twilo

      1. yo,

        ich habe mir noch mal alles von dir durchgelesen und verstehe jetzt auch, was du haben willst und deinen versuch mit GROUP BY und DISTINCT (die beiden Schlüsselwörter in einem "satz" macht nicht wirtklich sinn). eines ist mir noch nicht ganz klar, ob nun das datum und die zeit in einer spalte stehen oder in zwei. ich gehe mal davon aus, sie stehen in zwei spalten, wenn nicht, sollte es einfach von dir anzupassen sein.

        was du machen musst, ist eine unterabfrage, um die beiden Schlüsselwröter (GROUP BY und DISTINCT) voneinander zu trennen. Ich mache die zwei schritte nacheinander. Zuerst kommt das DISTINCT.

        SELECT DISTINCT datum, zeit
        FROM tabelle
        ;

        damit haben wir alle unterschiedlichen Werte von datum und zeit. nun kommt aussen herum die gruppierung.

        SELECT tab.datum, COUNT(*) AS Anzahl
        FROM (SELECT DISTINCT datum, zeit
              FROM tabelle
              ) tab
        GROUP BY tab.datum
        HAVING COUNT(*) > 1
        ;

        das sollte es eingentlich sein.

        Ilja

        1. Hallo,

          das sollte es eingentlich sein.

          super - folgender SQL Statement lieferte mir das Ergebnis

          SELECT tab.datum, COUNT(*) AS anzahl  
          FROM  
          (  
            SELECT DISTINCT TO_CHAR(gueltigab, 'YYYY-MM-DD') AS datum, TO_CHAR(gueltigab, 'HH24:MI:SS') AS zeit  
            FROM xxx  
          ) tab  
          GROUP BY tab.datum  
          HAVING COUNT(*) > 1;
          

          Ich wusste nicht, dass man bei From ein Select angeben kann.

          mfg
          Twilo

  2. Hallo!

    Beispiel:
        date    |   time
    ------------+----------
    2002-01-01 | 00:00:00
    2003-01-01 | 00:00:00
    2006-12-11 | 11:08:37
    2006-12-11 | 11:10:21
    2006-12-31 | 00:00:00
    2006-12-31 | 15:21:32
    2006-12-31 | 17:00:00

    zurückgegeben soll dann nur noch
        date    | count
    ------------+-------
    2006-12-11 |   2
    2006-12-31 |   3

    SELECT datum, COUNT(datum) FROM daten WHERE datum IN (SELECT datum FROM daten WHERE zeit > '00:00:00') GROUP BY datum ORDER BY datum;

    Kann man sicherlich auch mit einem SELF-Join lösen.

    André Laugks

    1. Hallo,

      Beispiel:
          date    |   time
      ------------+----------
      2002-01-01 | 00:00:00
      2003-01-01 | 00:00:00
      2006-12-11 | 11:08:37
      2006-12-11 | 11:10:21
      2006-12-31 | 00:00:00
      2006-12-31 | 15:21:32
      2006-12-31 | 17:00:00

      zurückgegeben soll dann nur noch
          date    | count
      ------------+-------
      2006-12-11 |   2
      2006-12-31 |   3

      SELECT datum, COUNT(datum) FROM daten WHERE datum IN (SELECT datum FROM daten WHERE zeit > '00:00:00') GROUP BY datum ORDER BY datum;

      psql -U xxx -d xxx -c "SELECT to_char(gueltigab, 'YYYY-MM-DD') AS date, COUNT(to_char(gueltigab, 'YYYY-MM-DD')) AS anzahl FROM xxx WHERE to_char(gueltigab, 'YYYY-MM-DD') IN (SELECT to_char(gueltigab, 'YYYY-MM-DD') AS date FROM xxx WHERE to_char(gueltigab, 'YYYY-MM-DD') > '00:00:00') GROUP BY date ORDER BY date;"
          date    | anzahl
      ------------+--------
       2002-01-01 |    153
       2003-01-01 |    153
       2006-12-11 |     32
       2006-12-31 |    161
      (4 Zeilen)

      das ist leider auch nicht das Ergebnis, was ich gerne hätte ;-)

      Kann man sicherlich auch mit einem SELF-Join lösen.

      was meinst du mit ein self-join?

      mfg
      Twilo

      1. Hallo!

        Deine Beispieltabelle

        Beispiel:
            date    |   time
        ------------+----------
        2002-01-01 | 00:00:00
        2003-01-01 | 00:00:00
        2006-12-11 | 11:08:37
        2006-12-11 | 11:10:21
        2006-12-31 | 00:00:00
        2006-12-31 | 15:21:32
        2006-12-31 | 17:00:00

        Dein Wunschergebnis

        date    | anzahl
        ------------+--------
        2002-01-01 |    153
        2003-01-01 |    153
        2006-12-11 |     32
        2006-12-31 |    161
        (4 Zeilen)

        das ist leider auch nicht das Ergebnis, was ich gerne hätte ;-)

        Nur wie soll man mit Deiner Beispieltabelle (7 Zeilen) auf Dein Wunschergebnis kommen?

        Vielleicht testest du mein SQL-Statement mit Deine Beispieltabelle, also den 7 Zeilen.

        André Laugks

        1. Hallo,

          Nur wie soll man mit Deiner Beispieltabelle (7 Zeilen) auf Dein Wunschergebnis kommen?

          Vielleicht testest du mein SQL-Statement mit Deine Beispieltabelle, also den 7 Zeilen.

          die obere Ausgabe wurde mit DISTINCT behandelt ;-)

          Ilja hat das richtige Statement gepostet
          SQL Statement

          mfg
          Twilo

      2. Hallo

        Kann man sicherlich auch mit einem SELF-Join lösen.
        was meinst du mit ein self-join?

        SELFHTML aktuell, Datenbanken, Fortgeschrittene Jointechniken, Selfjoin.

        Freundliche Grüße

        Vinzenz

  3. Hallo

    wie kann ich ermitteln, für welchen Tag es mehrere Einträge gibt?

    Beispiel:
        date    |   time
    ------------+----------
    2002-01-01 | 00:00:00
    2003-01-01 | 00:00:00
    2006-12-11 | 11:08:37
    2006-12-11 | 11:10:21
    2006-12-31 | 00:00:00
    2006-12-31 | 15:21:32
    2006-12-31 | 17:00:00

    das ist einfach.

    SELECT  
        date  
    FROM tabelle  
    GROUP BY date  
    HAVING COUNT(*) > 1
    

    psql -U xyz -d xyz -c "SELECT DISTINCT to_char(gueltigab, 'YYYY-MM-DD') AS date, TO_CHAR(gueltigab, 'HH24:MI:SS') AS time, count(gueltigab) FROM xyz GROUP BY gueltigab HAVING count(to_char(gueltigab, 'YYYY-MM-DD')) > 1"

    was soll das? Du darfst die Spalte "gueltigab" überhaupt nicht berücksichtigen, da Du sonst nicht so gruppieren kannst, wie Du willst.

    wie bekomme ich es hin, dass count soetwas ergibt?
        date    |   time   | count
    ------------+----------+-------
    2002-01-01 | 00:00:00 |   1
    2003-01-01 | 00:00:00 |   1
    2006-12-11 | 11:08:37 |   2
    2006-12-11 | 11:10:21 |   2
    2006-12-31 | 00:00:00 |   3
    2006-12-31 | 15:21:32 |   3
    2006-12-31 | 17:00:00 |   3

    Nimm die Spalte COUNT(*) AS count (ein superschlechter Spaltenname) hinzu.
    Mache daraus einen View. Joine die Ausgangstabelle mit dem View über die Spalte date.

    date    | count
    ------------+-------
    2002-01-01 |   1
    2003-01-01 |   1
    2006-12-11 |   2
    2006-12-31 |   3

    das ist wieder supereinfach:

    SELECT  
        date,  
        COUNT(*) AS anzahl -- count ist ein miserabler Spaltenname :-)  
    FROM tabelle  
    GROUP BY date  
    
    

    zurückgegeben soll dann nur noch
        date    | count
    ------------+-------
    2006-12-11 |   2
    2006-12-31 |   3

    ebenfalls einfach:

    SELECT  
        date,  
        COUNT(*) AS anzahl -- count ist ein miserabler Spaltenname :-)  
    FROM tabelle  
    GROUP BY date  
    HAVING COUNT(*) > 1
    

    das sollte sich aber mit having regeln lassen, wenn ich die richtige Anzahl ermitteln kann.

    ja, s.o.

    ps. Frage ist Daten die Mehrzahl von Datum?

    Ja.

    Zusammenfassung: Ich verstehe Dein Problem nicht.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      zurückgegeben soll dann nur noch
          date    | count
      ------------+-------
      2006-12-11 |   2
      2006-12-31 |   3

      ebenfalls einfach:

      SELECT

      date,
          COUNT() AS anzahl -- count ist ein miserabler Spaltenname :-)
      FROM tabelle
      GROUP BY date
      HAVING COUNT(
      ) > 1

        
      wenn ich den SQL-Befehl absetze, erhalte ich folgendes Ergebnis  
        
          date    | anzahl  
      \------------+--------  
       2003-01-01 |    153  
       2006-12-11 |     32  
       2002-01-01 |    153  
       2006-12-31 |    161  
      (4 Zeilen)  
        
      die Anzahl stimmt leider nicht.  
        
      So weit war ich auch schon :-)  
        
        
      mfg  
      Twilo  
      
      -- 
      [Farbtabelle](http://www.farb-tabelle.de)
      
      1. Hallo

        Hallo Vinzenz,

        zurückgegeben soll dann nur noch
            date    | count
        ------------+-------
        2006-12-11 |   2
        2006-12-31 |   3

        ebenfalls einfach:

        SELECT

        date,
            COUNT() AS anzahl -- count ist ein miserabler Spaltenname :-)
        FROM tabelle
        GROUP BY date
        HAVING COUNT(
        ) > 1

        
        >   
        > wenn ich den SQL-Befehl absetze, erhalte ich folgendes Ergebnis  
        >   
        >     date    | anzahl  
        > ------------+--------  
        >  2003-01-01 |    153  
        >  2006-12-11 |     32  
        >  2002-01-01 |    153  
        >  2006-12-31 |    161  
        > (4 Zeilen)  
          
        Dann hast Du andere Daten als Du uns zeigst.  
          
        
        > die Anzahl stimmt leider nicht.  
          
        Dann machst Du etwas falsch.  
        Oder Du verschweigst uns Dinge, die wichtig sind.  
          
        Wenn Du vorher z.B. einen Join anwendest, dann musst Du uns das sagen.  
        Die von mir angegebene Anweisung gibt für die Beispieltabelle mit beliebigen  
        Daten genau das von Dir gewünschte Ergebnis.  
          
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. yo,

          Wenn Du vorher z.B. einen Join anwendest, dann musst Du uns das sagen.

          das habe ich am anfang auch gedacht, weil die anzahl der gruppierungen merkwürdig aussahen. aber ich hoffe, ich habe ihn nun richtig verstanden, schau mal in meinen letzten post.

          Ilja