PostgreSQL 7.4: doppelte Daten ausgeben
    
Twilo
    
    
      
    
  - datenbank
- 0 Ilja
- 0 André Laugks- 0 Twilo- 0 André Laugks- 0 Twilo
 
- 0 Vinzenz Mai
 
 
- 2 Vinzenz Mai- 0 Twilo- 0 Vinzenz Mai- 0 Ilja
 
 
 
 nicht angemeldet
 nicht angemeldetHallo,
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
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
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
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
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
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
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
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
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
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
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
Hallo Vinzenz,
zurückgegeben soll dann nur noch
date | count
------------+-------
2006-12-11 | 2
2006-12-31 | 3ebenfalls 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)
Hallo
Hallo Vinzenz,
zurückgegeben soll dann nur noch
date | count
------------+-------
2006-12-11 | 2
2006-12-31 | 3ebenfalls 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
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