Find last update user

Hallo ich hab ein Problem,
In meiner Datenbank hab ich verinfacht folgendes stehen.

[table=“width: 500”]

testcaseid
lastupdatedate
user


id1
2016-12-05
1


id1
2016-12-03
2


id2
2016-11-23
4


id2
2016-12-05
4

[/table]

ich bräuchte jetzt ein SQL statement, dass mir den User für jede testcaseid zurückliefert der als letztes den testfall bearbeitet hat.
Leider komm ich nicht drauf.

Das ergebnis sollte daher so aussehen.

[table=“width: 500”]

id1
2016-12-05
1


id2
2016-12-05
4

[/table]
danke für eure tipps.

*** Edit ***

Hab schon mit den komischsten group by und Order by konstrukten, geschachtelten selects gearbeitet aber ich sehe den Wald vor lauter Bäumen nicht mehr.

Als dbs kommt Oracle 12g zum Einsatz

Moin, ich hätte zwei Lösungen anzubieten:

  1. [SQL]select * from tbl_test where lastupdatedate in (select max(lastupdatedate) from tbl_test);[/SQL]

  2. [SQL]select distinct on (testcaseid) id, testcaseid, lastupdatedate, users from tbl_test order by testcaseid, lastupdatedate desc;[/SQL]

1.: Einfach alle mit den max lastupdatedate …
2.: distinct on testcaseid, sortiert nach lastupdatedate, also genau das Gewünschte …

Über Vor- und Nachteile bitte diskutieren.

(Das ‘on’ ist ist etwas eigen mancher SQL-Dialekte)

Mag vielleicht noch schöner gehen, aber zuerst mal das Datum des letzten Updates bekommen für jeden Testfall.

[SQL]select testcaseID, MAX(lastupdatedate) AS lastupdate
FROM Tests
GROUP BY testcaseID[/SQL]

Jetzt das ganze nochmals vereinigen

[SQL]select t1.*
FROM Tests t1, (select testcaseID, MAX(lastupdatedate) AS lastupdate
FROM Tests
GROUP BY testcaseID) as t2
WHERE
t1.testcaseID = t2.testcaseID
AND
t1.lastupdatedate = t2.lastupdate;[/SQL]

Daran hatte ich auch schon gedacht, in den Datensätzen oben wird nicht benötigt! Aber wir wissen nicht, wie die komplette Datenbank schaut.

Das Problem ist doch bei MAX und GROUP BY, wenn man alle Spalten wählen möchte, dass ‘Xxx must appear in the GROUP BY clause or be used in an aggregate function’ !!!

Das ist auch der Suchbegriff.

Also, wenn ‘distinct “on”’ vom RDBMS unterstützt wird, würd ich immer dahin tendieren. :smiley:

leider hast Du die DB nicht dazu geschrieben.

Bei Oracle ginge das so:
[SQL] select testcaseID, MAX(user) keep (dense_rank last order by lastupdatedate) AS lastupdate_user
FROM Tests
GROUP BY testcaseID[/SQL]

bye
TT

Danke euch beiden.

Die Lösung von ionutbaiu konnte auf mein Problem angewandt werden.

Nur der Vollständigkeit halber, da ich in meinem Beitrag auf Oracle hingewiesen habe, falls mal jemand anders diesen Beitrag findet:
Das ‘AS’ keyword wird von oracle nicht unterstützt, dort lautet es daher
[SQL]select t1.*
FROM Tests t1, (select testcaseID, MAX(lastupdatedate) lastupdate
FROM Tests
GROUP BY testcaseID) t2
WHERE
t1.testcaseID = t2.testcaseID
AND
t1.lastupdatedate = t2.lastupdate;
[/SQL]

Grüße von Edit:
Timothy_Truckel, hab deinen Beitrag leider zu spät gesehen, das von dir gezeigte Bsp. schaut interessant aus, und ich werd das auch noch versuchen, Danke

[quote=AmunRa]Das ‘AS’ keyword wird von oracle nicht unterstützt[/quote]Wirklich nicht? muss ich dass jetzt in meinen ganzen Prozeduren wieder löschen? ::slap1 [SPOILER]Doch, wird es, oder meinst Du MySql?[/SPOILER]bye
TT

Tagtag, ich hab ein paar erweiterte (Test-)Daten erstellt, die dem obigen Muster schauen:

1	id1	2016-12-05	1	
2	id1	2016-12-03	2	
3	id2	2016-11-23	4	
4	id2	2016-12-05	4	
5	id3	2016-11-25	1	
6	id3	2016-12-04	2	
7	id3	2016-12-15	2	
8	id3	2016-11-26	1	
9	id2	2016-11-21	1	
10	id1	2016-12-04	2	
11	id1	2016-12-01	4	
12	id3	2016-12-11	4	
13	id1	2016-12-02	2	
14	id3	2016-11-25	1	
15	id2	2016-11-15	4	
16	id1	2016-11-20	2	
17	id1	2016-11-24	4	
18	id2	2016-12-04	2	
19	id1	2016-12-09	2	
20	id1	2016-11-26	4	
21	id1	2016-12-01	2	
22	id1	2016-11-26	2	
23	id3	2016-11-25	4	
24	id2	2016-11-22	4	
25	id3	2016-12-11	1	
26	id2	2016-11-15	2	
27	id2	2016-12-10	4	
28	id1	2016-11-19	1	
29	id2	2016-11-17	4	
30	id1	2016-12-07	4	
31	id3	2016-11-24	4	
32	id3	2016-12-04	4	
33	id3	2016-11-27	1	
34	id2	2016-11-20	4	
35	id1	2016-11-23	1	
36	id2	2016-11-23	4	
37	id2	2016-12-06	4	
38	id2	2016-12-11	2	
39	id1	2016-12-06	4	
40	id2	2016-12-14	1	
41	id1	2016-11-15	2	
42	id3	2016-12-10	4	
43	id3	2016-12-12	1	
44	id2	2016-11-20	2	
45	id1	2016-12-01	2	
46	id1	2016-11-24	4	
47	id2	2016-12-08	2	
48	id1	2016-12-11	1	
49	id2	2016-11-16	4	
50	id3	2016-12-05	1	
51	id1	2016-11-29	2	
52	id2	2016-11-19	1	
53	id3	2016-11-15	1	
54	id1	2016-11-29	2	
55	id3	2016-11-18	4	
56	id1	2016-11-25	1	
57	id3	2016-12-01	2	
58	id1	2016-11-28	2	
59	id1	2016-12-07	2	
60	id1	2016-12-10	1	
61	id3	2016-11-20	1	
62	id3	2016-12-03	4	
63	id3	2016-11-22	2	
64	id3	2016-12-03	2	
65	id2	2016-12-13	4	
66	id1	2016-12-15	1	
67	id3	2016-12-02	2	
68	id3	2016-12-09	1	
69	id2	2016-11-19	2	
70	id3	2016-12-12	4	
71	id1	2016-11-24	1	
72	id2	2016-11-21	1	
73	id3	2016-12-07	4	
74	id3	2016-12-09	2	
75	id1	2016-11-23	2	
76	id1	2016-12-05	1	
77	id2	2016-11-30	4	
78	id2	2016-12-03	4	
79	id2	2016-12-02	1	
80	id3	2016-11-27	4	
81	id3	2016-12-09	1	
82	id2	2016-12-10	1	
83	id2	2016-12-07	2	
84	id2	2016-11-15	4	
85	id1	2016-11-27	1	
86	id2	2016-12-06	1	
87	id2	2016-12-13	1	
88	id1	2016-11-25	1	
89	id2	2016-11-23	2	
90	id2	2016-12-06	4	
91	id2	2016-11-17	4	
92	id3	2016-12-08	4	
93	id1	2016-11-26	2	
94	id1	2016-11-30	2	
95	id1	2016-11-27	4	
96	id2	2016-12-02	1	
97	id2	2016-12-08	1	
98	id2	2016-11-21	4	
99	id3	2016-11-24	1	
100	id3	2016-12-02	4	
101	id1	2016-12-15	1	
102	id2	2016-12-03	2	
103	id3	2016-12-15	2	
104	id1	2016-12-11	2	

id zwischen 1-3, date zwischen 15.11. und 15.12. (!) (also auch Zukunft!), user zwischen 1-2 und 4.

Wendet man jetzt das oben drauf an, dann bei
1.

7	id3	2016-12-15	2	
66	id1	2016-12-15	1	
101	id1	2016-12-15	1	
103	id3	2016-12-15	2	
101	id1	2016-12-15	1	
40	id2	2016-12-14	1	
103	id3	2016-12-15	2	

Also, falls möglich, 2.

:twisted:

@Timothy_Truckle

Also bei mir hat Oracle eine Exception geworfen als ich die subquery mit as umbenannt habe Ich meine sowas

[SQL]SELECT * FROM A,(SELECT * FROM B) AS C[/SQL]
erst als ich das AS entfernt habe ging das statment durch
[SQL]SELECT * FROM A,(SELECT * FROM B) C[/SQL]

[quote=AmunRa][SQL]SELECT * FROM A,(SELECT * FROM B) AS C[/SQL][/quote]OK, an der Stelle habe ich AS noch nicht verwendet…

bye
TT