Eindeutige Werte

engel4u

Benutzer
Beiträge
9
Hallo zusammen,

Ich habe eine Tabelle Aktivitäten:

ID____Produkt_Key ____Phase____Datum_Aenderung____Benutzer
1 _____A ____________Chance___2019-11-01 _________162
2_____A ____________Angebot___2019-11-06 _________162
3 _____B ____________Chance___2019-11-03 _________162
4 _____A ____________Chance___2019-11-02 _________200

Ich möchte nun den Produkt_key und die aktuelle Phase (sprich aktueller Eintrag lt. Datum_Aenderung) des Benutzers 162 haben.
Rauskommen soll also

Produkt_Key ___Phase
A ___________Angebot
B ___________ Chance

Wie muss ich das machen? Freu mich über jede Hilfe, ich bastel seit 2 Stunden und schaff es nicht. Es kommt jedes Mal die Phase Chance, obwohl beim Produkt A Angebot kommen müsste...
 
Werbung:
Grundsätzlich hast Du recht... Bei der Frage hier ist es jedoch ein klein wenig anders. Hier geht es darum, nur die letzte Phase zu ermitteln...
 
select produkt_key, max(datum_aenderung), phase
from dsv_aktivitaeten
where benutzer = 162
group by produkt_key

das liefert mir leider den Produkt_kay a mit der Phase Chance, richtig wäre aber Angebot...
 
Dein Select sollte einen Fehler melden, und gar kein Resultat. Alle Spalten müssen entweder aggregiert (max(datum) oder gruppiert sein, Du gruppierst nach produkt_key, im Result steht aber noch phase. MySQL ist so strunzdumm, daß es den Syntaxfehler (!) hier nicht erkennt, und liefert stattdessen ein falsches Resultat.

Damit hast Du jetzt auch dem Weg zur Lösung.
 
Es kommt tatsächlich kein Fehler. Ich schau mal, dass ich verstehe was Du meinst :) Und dann hoffe ich, dass ich das endlich abschließen kann. Nicht mein Tag heute...
 
@akretschmer : ich bin zu blöd, sorry, ich bekomme es nicht hin. Wenn ich die Gruppierung weglasse kommt nur EIN Datensatz. Bezogen auf mein Beispiel sieht das Ergebnis wie folgt aus:

select produkt_key, max(datum_aenderung), phase
from dsv_aktivitaeten
where benutzer = 162

liefert:

Produkt_Key ___Phase
A ___________Chance

select produkt_key, max(datum_aenderung), phase
from dsv_aktivitaeten
where benutzer = 162
group by produkt_key

liefert

Produkt_Key ___Phase
A ___________Chance
B ___________ Chance

Du kannst mich gerne steinigen, aber ich bekomme es nicht hin. Wäre Dir wirklich dankbar für die Lösung...
 
Code:
 key |  phase  |   datum   
-----+---------+------------
 a   | chance  | 2019-11-01
 a   | angebot | 2019-11-06
 b   | chance  | 2019-11-03
 a   | chance  | 2019-11-02
(4 rows)

test=*# select key, max(datum), phase from engel4u group by key;
ERROR:  column "engel4u.phase" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select key, max(datum), phase from engel4u group by key;
                                ^
test=*# select key, max(datum), phase from engel4u group by key, phase;
 key |    max     |  phase  
-----+------------+---------
 a   | 2019-11-02 | chance
 b   | 2019-11-03 | chance
 a   | 2019-11-06 | angebot
(3 rows)

test=*#
 
Okay. Aber in Deinem 2. Beispiel kommt das Produkt A jetzt zweimal. Es darf aber nur einmal erscheinen, nämlich mit der Phase Angebot (=höheres Datum). Geht das?
 
Code:
test=*# with tmp as (select key, max(datum) from engel4u group by key) select * from engel4u right join tmp on (engel4u.key, engel4u.datum) = (tmp.key, tmp.max);
 key |  phase  |   datum    | key |    max     
-----+---------+------------+-----+------------
 a   | angebot | 2019-11-06 | a   | 2019-11-06
 b   | chance  | 2019-11-03 | b   | 2019-11-03
(2 rows)
 
na gut, ich will mal nicht so sein (obige Syntax kann MySQL nicht, ist zu modern und cool für MySQL ...

Code:
test=*# select * from engel4u where (key, datum) in (select key, max(datum) from engel4u group by key);
 key |  phase  |   datum   
-----+---------+------------
 a   | angebot | 2019-11-06
 b   | chance  | 2019-11-03
(2 rows)
 
Kommt leider trotzdem ein Fehler...

#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'key, datum) in (select key, max(datum) from engel4u group by key) LIMIT 0, 25' in Zeile 1

with kann MySQL glaub ich sogar...
 
Werbung:
Zurück
Oben