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