DISTINCT funktioniert nicht
DISTINCT funktioniert nicht
am 26.02.2007 11:03:19 von Thomas Barth
Hallo,
ich möchte doppelte Zeilen bei einem Select ausblenden, funktioniert
aber nicht so, wie ich mir das vorstelle. Doppelte Zeilen werden
angezeigt, weil sich die anderen Felder unterscheiden:
mysql> select distinct(caller_id), date_time, serv_id from calls_in
limit 10;
+-------------+---------------------+---------+
| caller_id | date_time | serv_id |
+-------------+---------------------+---------+
| 053713 | 2006-01-01 00:04:44 | 107.33 |
| 0 | 2006-01-01 00:05:24 | 106.0 |
| 0 | 2006-01-01 00:06:19 | 106.0 |
| 0 | 2006-01-01 00:06:54 | 106.0 |
| 0 | 2006-01-01 00:09:08 | 107.51 |
| 053713 | 2006-01-01 00:10:36 | 107.33 |
| 0 | 2006-01-01 00:11:34 | 106.0 |
| 01713888 | 2006-01-01 00:12:41 | 107.33 |
| 05281989077 | 2006-01-01 00:12:59 | 107.2 |
| 0 | 2006-01-01 00:13:14 | 106.0 |
+-------------+---------------------+---------+
10 rows in set (0.03 sec)
DISTINCT scheint hier wirklich ein besonderer Fall von group by zu sein.
Wenn ich die Felder date_time und serv_id weglasse, funktioniert es. Was
muss ich tun, dass z.B. von den beiden Datensätzen
| 053713 | 2006-01-01 00:04:44 | 107.33 |
und
| 053713 | 2006-01-01 00:10:36 | 107.33 |
der jüngste genommen wird? Ich möchte eine neue Tabelle mit eindeutigen
caller_ids erstellen.
Gruß,
Thomas
Re: DISTINCT funktioniert nicht
am 26.02.2007 11:12:03 von Daniel Fischer
Thomas Barth!
> ich möchte doppelte Zeilen bei einem Select ausblenden, funktioniert
> aber nicht so, wie ich mir das vorstelle. Doppelte Zeilen werden
> angezeigt, weil sich die anderen Felder unterscheiden:
>
> mysql> select distinct(caller_id), date_time, serv_id from calls_in
So funktioniert DISTINCT nicht. Du schreibst ja schon selbst, dass du
doppelte Zeilen ausblenden willst. DISTINCT macht genau das. Aber zwei
Zeilen sind nunmal nicht gleich, wenn sich einzelne Felder unterscheiden...
> Wenn ich die Felder date_time und serv_id weglasse, funktioniert es. Was
> muss ich tun, dass z.B. von den beiden Datensätzen
>
> | 053713 | 2006-01-01 00:04:44 | 107.33 |
>
> und
>
> | 053713 | 2006-01-01 00:10:36 | 107.33 |
>
> der jüngste genommen wird? Ich möchte eine neue Tabelle mit eindeutigen
> caller_ids erstellen.
Das geht mit GROUP BY, ungefähr so:
SELECT caller_id, MAX(date_time), serv_id FROM calls_in GROUP BY caller_id
Gruß
Daniel
Re: DISTINCT funktioniert nicht
am 26.02.2007 11:19:52 von Robert Klemme
On 26.02.2007 11:12, Daniel Fischer wrote:
> Thomas Barth!
>
>> ich möchte doppelte Zeilen bei einem Select ausblenden, funktioniert
>> aber nicht so, wie ich mir das vorstelle. Doppelte Zeilen werden
>> angezeigt, weil sich die anderen Felder unterscheiden:
>>
>> mysql> select distinct(caller_id), date_time, serv_id from calls_in
>
> So funktioniert DISTINCT nicht. Du schreibst ja schon selbst, dass du
> doppelte Zeilen ausblenden willst. DISTINCT macht genau das. Aber zwei
> Zeilen sind nunmal nicht gleich, wenn sich einzelne Felder unterscheiden...
>
>> Wenn ich die Felder date_time und serv_id weglasse, funktioniert es. Was
>> muss ich tun, dass z.B. von den beiden Datensätzen
>>
>> | 053713 | 2006-01-01 00:04:44 | 107.33 |
>>
>> und
>>
>> | 053713 | 2006-01-01 00:10:36 | 107.33 |
>>
>> der jüngste genommen wird? Ich möchte eine neue Tabelle mit eindeutigen
>> caller_ids erstellen.
>
> Das geht mit GROUP BY, ungefähr so:
>
> SELECT caller_id, MAX(date_time), serv_id FROM calls_in GROUP BY caller_id
Ich glaube nicht, dass das funktionieren wird, weil serv_id weder im
GROUP BY auftaucht noch eine Aggregatsfunktion hat. In deinem Fall
scheint dieses hier zu gehen, da der Wert von serv_id immer mit
caller_id zu korrespondieren scheint:
SELECT caller_id, MAX(date_time), MAX(serv_id)
FROM calls_in
GROUP BY caller_id
Sonst geht das über einen Selfjoin bzw. geschachtelte Query
SELECT t1.caller_id, t1.date_time, t1.serv_id
FROM calls_in t1
(
select caller_id, max(date_time) date_time
from calls_in
group by caller_id
) t2
WHERE t1.caller_id = t2.caller_id
AND t1.date_time = t2.date_time
Ciao
robert
Re: DISTINCT funktioniert nicht
am 26.02.2007 11:27:19 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: DISTINCT funktioniert nicht
am 26.02.2007 11:29:31 von Claus Reibenstein
Thomas Barth schrieb:
> ich möchte doppelte Zeilen bei einem Select ausblenden, funktioniert
> aber nicht so, wie ich mir das vorstelle. Doppelte Zeilen werden
> angezeigt, weil sich die anderen Felder unterscheiden:
Welche "anderen Felder"?
> mysql> select distinct(caller_id), date_time, serv_id from calls_in
^ ^
Die Klammern sind überflüssig.
> limit 10;
> +-------------+---------------------+---------+
> | caller_id | date_time | serv_id |
> +-------------+---------------------+---------+
> | 053713 | 2006-01-01 00:04:44 | 107.33 |
> | 0 | 2006-01-01 00:05:24 | 106.0 |
> | 0 | 2006-01-01 00:06:19 | 106.0 |
> | 0 | 2006-01-01 00:06:54 | 106.0 |
> | 0 | 2006-01-01 00:09:08 | 107.51 |
> | 053713 | 2006-01-01 00:10:36 | 107.33 |
> | 0 | 2006-01-01 00:11:34 | 106.0 |
> | 01713888 | 2006-01-01 00:12:41 | 107.33 |
> | 05281989077 | 2006-01-01 00:12:59 | 107.2 |
> | 0 | 2006-01-01 00:13:14 | 106.0 |
> +-------------+---------------------+---------+
> 10 rows in set (0.03 sec)
Und was ist daran falsch?
> DISTINCT scheint hier wirklich ein besonderer Fall von group by zu sein.
DISTINCT bezieht sich immer auf eine komplette Zeile. Insofern kann man
es durchaus als einen besonderen Falls von GROUP BY betrachten.
> Wenn ich die Felder date_time und serv_id weglasse, funktioniert es.
Was meinst Du mit "funktioniert es"?
> Was muss ich tun, dass z.B. von den beiden Datensätzen
>
> | 053713 | 2006-01-01 00:04:44 | 107.33 |
>
> und
>
> | 053713 | 2006-01-01 00:10:36 | 107.33 |
>
> der jüngste genommen wird?
Dich mit GROUP BY auseinandersetzen.
GruÃ. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /
Re: DISTINCT funktioniert nicht
am 26.02.2007 11:34:04 von Daniel Fischer
Robert Klemme!
>> SELECT caller_id, MAX(date_time), serv_id FROM calls_in GROUP BY
>> caller_id
>
> Ich glaube nicht, dass das funktionieren wird, weil serv_id weder im
> GROUP BY auftaucht noch eine Aggregatsfunktion hat.
Du hast Recht, ich habe serv_id irgendwie geistig ausgeblendet. MySQL wird
hier immer den ersten Wert liefern, den es findet.
Gruß
Daniel
Re: DISTINCT funktioniert nicht
am 26.02.2007 12:59:57 von dnoeth
Andreas Kretschmer wrote:
> $Anderes_System hat DISTINCT ON, was aber, so wie auch LIMIT und OFFSET,
> kein SQL-Standard ist, sondern eine Erweiterung dessen. Vielleicht wirst
> Du im MySQL ja auch fündig:
>
> http://www.postgresql.org/docs/current/static/sql-select.htm l#SQL-DISTINCT
>
>
> test=# select distinct a,b,c from d;
> a | b | c
> ---+---+---
> 1 | 1 | 1
> 1 | 2 | 2
> 1 | 2 | 3
> 2 | 1 | 2
> 2 | 2 | 2
> (5 rows)
>
> test=*# select distinct on (a) a,b,c from d;
> a | b | c
> ---+---+---
> 1 | 1 | 1
> 2 | 1 | 2
> (2 rows)
Und warum 1 1 1 und nicht 1 2 2 oder 1 2 3?
Zufall oder sind da höhere Mächte am Werken?
Das ist im Prinzip genau der gleiche Unsinn, den mysql macht mit:
select a,b,c from d group by a;
Und da würdest du doch sicher meckern ;-)
Dieter
Re: DISTINCT funktioniert nicht
am 26.02.2007 13:02:34 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: DISTINCT funktioniert nicht
am 26.02.2007 13:11:43 von dnoeth
Andreas Kretschmer wrote:
>>> http://www.postgresql.org/docs/current/static/sql-select.htm l#SQL-DISTINCT
>> Und warum 1 1 1 und nicht 1 2 2 oder 1 2 3?
>> Zufall oder sind da höhere Mächte am Werken?
>
> Ich nannte einen Link, der Dir diese Frage erklärt.
"Note that the "first row" of each set is unpredictable unless ORDER BY
is used to ensure that the desired row appears first"
Und das ORDER BY fehlt bei deinem Beispiel ;-)
Dieter