Doppelte Zeilen

Doppelte Zeilen

am 03.01.2007 20:47:27 von Sascha Clausen

Hallo MySQL- Freunde,

ich habe folgende MySQL- Tabelle (Beispiel):

Name | A | B
------------
ABC | 6 | 5
DEF | 8 | 1
ABC | 9 | 1
DEF | 4 | 3

Jetzt möchte ich gerne alle Spalten selecten und nach Name sortieren. Das
ist kein Problem.
Jetzt möchte ich aber doppelte Einträge in Name nur 1 x ausgegeben haben.
Also es sollen bei dem Beispiel nicht 4 sondern 2 Zeilen zurückgegeben
werden. 1 x "ABC" und 1 x "DEF".

Auch kein Problem.
Jetzt aber das Wichtige - und das Problem:
Es gibt jeweils 2 Zeilen mit ABC und DEF.
Ich möchte jeweils die Zeile zurückgegeben haben, wo die Differenz von A
und B am größten ist.
Also die Zeilen
ABC | 9 | 1
DEF | 8 | 1

in dem oberen Beispiel.
Sortiert werden soll aber nach Name (falls das relevant und wichtig ist).

Hat jemand einen Tipp für mich?
Danke!

Re: Doppelte Zeilen

am 03.01.2007 21:13:21 von Oliver Dietz

Hallo,

> [...]
> Sortiert werden soll aber nach Name (falls das relevant und wichtig ist).

vielleicht so:
---
SELECT t.name, t.a, t.b FROM t, (SELECT name, MAX(a-b) AS d FROM t GROUP BY
name) AS m WHERE t.name=m.name AND t.a-t.b=m.d GROUP BY t.name ORDER BY
t.name
---

Was passiert wenn das Maximum von a-b nicht eindeutig ist?

Das obere Statement wählt dann einen der Datensätze aus ... falls alle
Zeilen mit dem Maximum ausgegeben werden sollen, einfach das letzte GROUP BY
weg lassen.


Schöne Grüße,
Oliver

Re: Doppelte Zeilen

am 03.01.2007 21:21:21 von Thomas Rachel

Sascha Clausen wrote:

> Name | A | B
> ------------
> ABC | 6 | 5
> DEF | 8 | 1
> ABC | 9 | 1
> DEF | 4 | 3
>
> Jetzt möchte ich gerne alle Spalten selecten und nach Name sortieren.
> Das ist kein Problem.
> Jetzt möchte ich aber doppelte Einträge in Name nur 1 x ausgegeben
> haben. Also es sollen bei dem Beispiel nicht 4 sondern 2 Zeilen
> zurückgegeben werden. 1 x "ABC" und 1 x "DEF".

SELECT T.Name, A, B FROM Tabelle T JOIN (SELECT Name, max(A-B) AS d FROM
Tabelle GROUP BY Name) AS T2 WHERE T.A-T.B=T2.d ORDER BY Name

dürfte tun, was Du willst (ungetestet).

Problem: Wenn ein mehrere A-B-Paare dieselbe Differenz haben, kommt es zu
Dopplungen.


Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg

Re: Doppelte Zeilen

am 03.01.2007 21:22:34 von sinbag

Sascha Clausen schrieb:

> Name | A | B
> ------------
> ABC | 6 | 5
> DEF | 8 | 1
> ABC | 9 | 1
> DEF | 4 | 3

> Ich möchte jeweils die Zeile zurückgegeben haben, wo die Differenz von A
> und B am größten ist.

> ABC | 9 | 1
> DEF | 8 | 1

> Hat jemand einen Tipp für mich?

SELECT
Name, A, B
FROM
Tabelle T
WHERE
ABS(A - B) = (
SELECT MAX(ABS(A - B)) FROM Tabelle Ti WHERE T.Name = Ti.Name
)
GROUP BY Name
ORDER BY Name

Ist zwar ungetestet, sollte aber so funktionieren.

Sin

Re: Doppelte Zeilen

am 03.01.2007 22:04:53 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Doppelte Zeilen

am 03.01.2007 22:04:53 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)