[Problem] GROUP BY ..
am 17.03.2006 14:57:46 von Matze Mueller
Hey Ihr Vielen!
Hoffe einfach mal, dass ich hier richtig bin - ansonsten Sorry..!
Ich probier mich grad bisschen im SQL, dachte bisher auch, es klappt
ganz gut.. Aber jetzt verzweifel ich grad bisschen.. Hmm..
Also.. Gegeben sei eine Tabelle, bspw. diese hier mit diesen Daten:
[ ID ] [ Jahr ] [ JAHRESZEIT ] [ Z_ID ] [ WETTER ] [ Stufe ]
[ 01 ] [ 2005 ] [ Sommer ] [ Z1 ] [ Sonnig ] [ 5 ]
[ 02 ] [ 2005 ] [ Sommer ] [ Z2 ] [ Regen ] [ 7 ]
[ 03 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 3 ]
[ 04 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 1 ]
[ 05 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 1 ]
[ 06 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 4 ]
[ 07 ] [ 2005 ] [ Sommer ] [ Z4 ] [ Sonnig ] [ 2 ]
HeHe - schoen hab ich's gemacht :) Spass beiseite! Ich moechte jetzt
eigentlich nix anderes, als das letzte Wetter von
[2005][Sommer][Z3]
und die zugehoerige Stufe!?! Kann doch nicht unmoeglich sein, oder?!
Sprich: (Regen=1) & (Sonne=4).
Kann mich toll erklaeren, ich weiss - 'tschuldigung.. Jedenfalls, mit
Select WETTER, MAX(ID) AS ID From TABELLE Where ... GROUP BY WETTER
bekomm ich zwar
[ 05 ] [ Regen ]
[ 06 ] [ Sonnig ]
was ja definitiv die letzten, ja, die gewollten sind, aber ich bekomm
diese verdammte Stufe einfach nicht so in meine Abfrage, dass die dann
mit ausgegeben wird?!? Wenn ich die - auf welche Art u Weise auch immer,
mit ins SELECT schreibe, bekomm ich nur Fehler, von wegen, muss ne
Aggregat-Fkt. sein bzw. mit geGROUPBYt werden.. Da bekomm ich aber
wieder nicht mehr die richtigen Eintraege.. Und fuer alles ermittelte
nochmal ne Schleife u Extra-Abfrage.. Na, ich weiss nicht.. Hmm.. Alles
doof ;)
NJa, vielleicht versteht ja jemand mein Problem, und kann mich bissle in
die richtige Richtung schubbn..
Vielen Dank schonmal u ein schoenes WE!!
Gruesse,
Matze
Re: [Problem] GROUP BY ..
am 17.03.2006 17:02:35 von Johannes Vogel
Hi Matze
Matze Mueller wrote:
> Hoffe einfach mal, dass ich hier richtig bin - ansonsten Sorry..!
> Ich probier mich grad bisschen im SQL, dachte bisher auch, es klappt
> ganz gut.. Aber jetzt verzweifel ich grad bisschen.. Hmm..
> Also.. Gegeben sei eine Tabelle, bspw. diese hier mit diesen Daten:
> [ ID ] [ Jahr ] [ JAHRESZEIT ] [ Z_ID ] [ WETTER ] [ Stufe ]
> [ 01 ] [ 2005 ] [ Sommer ] [ Z1 ] [ Sonnig ] [ 5 ]
> [ 02 ] [ 2005 ] [ Sommer ] [ Z2 ] [ Regen ] [ 7 ]
> [ 03 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 3 ]
> [ 04 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 1 ]
> [ 05 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 1 ]
> [ 06 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 4 ]
> [ 07 ] [ 2005 ] [ Sommer ] [ Z4 ] [ Sonnig ] [ 2 ]
> HeHe - schoen hab ich's gemacht :) Spass beiseite! Ich moechte jetzt
> eigentlich nix anderes, als das letzte Wetter von
> [2005][Sommer][Z3]
> und die zugehoerige Stufe!?! Kann doch nicht unmoeglich sein, oder?!
> Sprich: (Regen=1) & (Sonne=4).
Definiere 'Letzte'! Die ID dazu zu verwenden ist eine schlechte Idee.
select jahr, jahreszeit, z_id, wetter, stufe
from Wetter
where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
group by wetter;
So - Nun hast du aber das Problem, dass GROUP BY per Definition einen
beliebigen Eintrag rausfischt. Tatsächlich wird aber bei MySQL bisher
der erste Eintrag verwendet. Dies kann sich aber in anderen Versionen
ändern.
Du könntest also sichergehen, dass die Reihenfolge gemäss dir gewünscht
vorher eingehalten wird. Dann selektierst du die gewünschten Einträge raus.
select wetter, stufe from (
select wetter, stufe
from Wetter
where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
order by id desc) a
group by wetter;
HTH, Johannes
Re: [Problem] GROUP BY ..
am 17.03.2006 17:13:00 von Matze Mueller
Johannes Vogel schrieb:
> Hi Matze
>
> [....]
Vielen Dank fuer die schnelle u ausfuehrliche Antwort! Werde es alsbald
testen!
> HTH, Johannes
Viele Gruese u ein schoenes WochenEnde
MfG Matze
Re: [Problem] GROUP BY ..
am 18.03.2006 15:51:27 von Matze Mueller
[...]
Hallo Hallo nochmal..
HmmHmmHmm.. So richtig komm ich noch nicht ganz schlau, muss da nochmal
kurz fragen..
_____
Johannes Vogel schrieb:
> select jahr, jahreszeit, z_id, wetter, stufe
> from Wetter
> where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
> group by wetter;
Also, so in die Richtung waere schonmal was fuer mich! Aber passt
irgendwie nicht?! Wenn ich das so schreibe, meckert er ausser [Wetter]
alles (?! - oder sagen wir mal, spaetestens [Stufe]) an, weil es weder
in einer GROUP-Anweisung, noch in einer Aggregat-Funktion auftaucht?!
Kann man das nicht irgendwie realisieren?! Hab totale Denkschwaeche bei
dieser Schiss-Fkt.?! - Wobei ich ja wie gesagt auch kein SQL-Guru bin..
Sagen wir mal, egal wie richtig od. falsch die Ergebnisse waeren, sowas wie
"Select Wetter, MAX(ID) AS ID, Stufe FROM tabWetter WHERE Z_ID = Z3
GROUP BY Wetter"
geht nicht irgendwie?!?! Wie gesagt, ohne das 'Stufe' klappts
'wunderbar', zumindest kommen die Daten wo ich haben moechte. Lediglich
dieser Stufe-Wert fehlt mir?! Hmm.. Ich glaub, ich versteh das alles
noch nicht ;)
Und wenn ich es so schreiben wuerde:
> select wetter, stufe from (
> select wetter, stufe
> from Wetter
> where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
> order by id desc) a
> group by wetter;
dann meckert er, dass das OrderBy in der inneren Select nicht sein darf,
es sei denn, ein "..TOP is gesetzt.."?!
Nja, ich werd einfach nochmal bissle experimentieren. Falls aber
jemandem ein eindeutiges Fehldenken bei mir feststellen kann.. -> Bitte
Bescheid geben, und vielen Dank schonmal dafuer!
Gruese u schoenes Wochenende,
Matze
Re: [Problem] GROUP BY ..
am 18.03.2006 19:20:21 von Johannes Vogel
Hi Matze
Welche MySQL-Version benutzt du denn eigentlich?
Folgendes gilt zumindest für Version 5.x, sollte aber für >= 4.1 gelten.
CREATE TABLE test (
ID int(11) default NULL,
Jahr int(11) default NULL,
JAHRESZEIT varchar(10) default NULL,
ZID int(11) default NULL,
WETTER varchar(10) default NULL,
Stufe int(11) default NULL
) TYPE=MyISAM;
INSERT INTO test VALUES (1,2005,'Sommer',1,'Sonnig',5);
INSERT INTO test VALUES (2,2005,'Sommer',2,'Regen',7);
INSERT INTO test VALUES (3,2005,'Sommer',3,'Regen',3);
INSERT INTO test VALUES (4,2005,'Sommer',3,'Sonnig',1);
INSERT INTO test VALUES (5,2005,'Sommer',3,'Regen',1);
INSERT INTO test VALUES (6,2005,'Sommer',3,'Sonnig',4);
INSERT INTO test VALUES (7,2005,'Sommer',4,'Sonnig',2);
(Weshalb eigentlich 'Z1'.. ID's sind numerisch - das z kannst du
streichen und stattdessen dann integer-Werte benutzen).
Matze Mueller wrote:
> Johannes Vogel schrieb:
>> select jahr, jahreszeit, z_id, wetter, stufe
>> from Wetter
>> where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
>> group by wetter;
mysql> select jahr, jahreszeit, zid, wetter, stufe
-> from test where jahr = 2005 and jahreszeit='Sommer' and zid=3
-> group by wetter;
+------+------------+------+--------+-------+
| jahr | jahreszeit | zid | wetter | stufe |
+------+------------+------+--------+-------+
| 2005 | Sommer | 3 | Regen | 3 |
| 2005 | Sommer | 3 | Sonnig | 1 |
+------+------------+------+--------+-------+
2 rows in set (0.00 sec)
> Also, so in die Richtung waere schonmal was fuer mich! Aber passt
> irgendwie nicht?! Wenn ich das so schreibe, meckert er ausser [Wetter]
> alles (?! - oder sagen wir mal, spaetestens [Stufe]) an, weil es weder
> in einer GROUP-Anweisung, noch in einer Aggregat-Funktion auftaucht?!
> Und wenn ich es so schreiben wuerde:
>> select wetter, stufe from (
>> select wetter, stufe
>> from Wetter
>> where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
>> order by id desc) a
>> group by wetter;
> dann meckert er, dass das OrderBy in der inneren Select nicht sein darf,
> es sei denn, ein "..TOP is gesetzt.."?!
mysql> select * from (
-> select wetter, stufe
-> from test
-> where jahr = 2005 and jahreszeit='Sommer' and ZID = 3
-> order by id desc) as a
-> group by wetter;
+--------+-------+
| wetter | stufe |
+--------+-------+
| Regen | 1 |
| Sonnig | 4 |
+--------+-------+
2 rows in set (0.03 sec)
HTH, Johannes
Re: [Problem] GROUP BY ..
am 20.03.2006 22:39:22 von Dominik Echterbruch
Johannes Vogel wrote:
>
>>Hoffe einfach mal, dass ich hier richtig bin - ansonsten Sorry..!
>>Ich probier mich grad bisschen im SQL, dachte bisher auch, es klappt
>>ganz gut.. Aber jetzt verzweifel ich grad bisschen.. Hmm..
>>Also.. Gegeben sei eine Tabelle, bspw. diese hier mit diesen Daten:
>>[ ID ] [ Jahr ] [ JAHRESZEIT ] [ Z_ID ] [ WETTER ] [ Stufe ]
>>[ 01 ] [ 2005 ] [ Sommer ] [ Z1 ] [ Sonnig ] [ 5 ]
>>[ 02 ] [ 2005 ] [ Sommer ] [ Z2 ] [ Regen ] [ 7 ]
>>[ 03 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 3 ]
>>[ 04 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 1 ]
>>[ 05 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Regen ] [ 1 ]
>>[ 06 ] [ 2005 ] [ Sommer ] [ Z3 ] [ Sonnig ] [ 4 ]
>>[ 07 ] [ 2005 ] [ Sommer ] [ Z4 ] [ Sonnig ] [ 2 ]
>>HeHe - schoen hab ich's gemacht :) Spass beiseite! Ich moechte jetzt
>>eigentlich nix anderes, als das letzte Wetter von
>>[2005][Sommer][Z3]
>>und die zugehoerige Stufe!?! Kann doch nicht unmoeglich sein, oder?!
>>Sprich: (Regen=1) & (Sonne=4).
>
> Definiere 'Letzte'! Die ID dazu zu verwenden ist eine schlechte Idee.
Sehe ich genauso. Da es vermutlich um den jüngsten Eintrag geht,
empfehle ich die Verwendung einer DATE bzw. DATETIME Spalte. Das Jahr
kann man dann immer noch daraus extrahieren - und die Jahreszeit ergibt
sich auch automatisch :)
> select jahr, jahreszeit, z_id, wetter, stufe
> from Wetter
> where jahr = 2005 and jahreszeit='Sommer' and Z_ID = 'Z3'
> group by wetter;
Ich denke, du stimmst mit mir überein, daß es besser ist, von jedem Wert
genau zu wissen, welcher es ist, ihn also exakt zu definieren. Dann ist
die einzige (mir bekannte) Lösung ein LEFT JOIN:
SELECT a.jahr, a.jahreszeit, a.z_id, a.wetter, a.stufe
FROM wetter a
LEFT JOIN wetter b ON b.id < a.id
WHERE a. jahr = 2005 AND a.jahreszeit = 'Sommer' AND a.z_id = 'Z3'
AND b.id IS NULL
Aufgrund der Uhrzeit habe ich es jetzt nicht mehr getestet, aber ich
denke, das Prnzip ist klar.
Grüße,
Dominik
Re: [Problem] GROUP BY ..
am 22.03.2006 11:52:07 von Matze Mueller
Johannes Vogel schrieb:
> Hi Matze
Ein sonniges Hallo auch :)
> Welche MySQL-Version benutzt du denn eigentlich?
> Folgendes gilt zumindest für Version 5.x, sollte aber für >= 4.1 gelten.
Hmm.. Hmm.. Mit 'nem grossen Knüppel sollte man mich verhauen! Denn, ich
hab gar *kein* MySQL.. Ich bin so alle. Hab doch bloss das
".de..datenbank...sql" gelesen und dacht -> das isses.. Grosses Sorry!
Jedoch war dies *nicht* umsonst:
> [ .. MySQL-Anweisung und Beschreibung .. ]
... hat mir sehr geholfen! Bisschen anderer Syntax, aber der Ansatz war
ja das, was ich gesucht hab! Und der funktioniert feinstens!
Also vielen Dank nochmal!
Wuensch noch einen schoenen Tag,
> HTH, Johannes
Gruesse, Matze
Re: [Problem] GROUP BY ..
am 22.03.2006 11:56:45 von Johannes Vogel
Hi Matze
Matze Mueller wrote:
> Johannes Vogel schrieb:
>> Welche MySQL-Version benutzt du denn eigentlich?
>> Folgendes gilt zumindest für Version 5.x, sollte aber für >= 4.1 gelten.
> Hmm.. Hmm.. Mit 'nem grossen Knüppel sollte man mich verhauen! Denn, ich
> hab gar *kein* MySQL.. Ich bin so alle. Hab doch bloss das
> ".de..datenbank...sql" gelesen und dacht -> das isses.. Grosses Sorry!
Tz... Das ist wenigstens mal was neues...
Also de.comp.datenbanken.misc ist nebenan.
> Jedoch war dies *nicht* umsonst:
>> [ .. MySQL-Anweisung und Beschreibung .. ]
> .. hat mir sehr geholfen! Bisschen anderer Syntax, aber der Ansatz war
> ja das, was ich gesucht hab! Und der funktioniert feinstens!
> Also vielen Dank nochmal!
> Wuensch noch einen schoenen Tag,
Gern geschehen und ebenfalls viel Spass am Tag :-)
Johannes
Re: [Problem] GROUP BY ..
am 22.03.2006 21:10:34 von dnoeth
Matze Mueller wrote:
> Hmm.. Hmm.. Mit 'nem grossen Knüppel sollte man mich verhauen! Denn, ich
> hab gar *kein* MySQL.. Ich bin so alle. Hab doch bloss das
> ".de..datenbank...sql" gelesen und dacht -> das isses.. Grosses Sorry!
Welches DBMS hast du denn?
Z.B. mit den neuen SQL:1999 OLAP Funktionen in Oracle/MS
SS2005/UDB/Teradata geht's einfach:
select ...
from
(select
row_number() over (partition by jahr, jahreszeit, z_id, wetter
order by id desc) as rn,
...
from tabelle
) dt
where rn = 1
Dieter
Re: [Problem] GROUP BY ..
am 23.03.2006 10:45:46 von Matze Mueller
Dieter Noeth schrieb:
> Welches DBMS hast du denn?
> Z.B. mit den neuen SQL:1999 OLAP Funktionen in Oracle/MS
> SS2005/UDB/Teradata geht's einfach:
Gtn Morgen!
Hmm.. Gute Frage.. Vorallem, was damit gemeint ist - bin doch Frischling
:) Ich nutze MS SQL Server Version 8.00, und werkel da bisschen mit MS
VS .Net03 drauf rum, falls Dir das Deine Frage irgendwie beantwortet?! Hmm..
> select ...
> from
> (select
> row_number() over (partition by jahr, jahreszeit, z_id, wetter
> order by id desc) as rn,
> ...
> from tabelle
> ) dt
> where rn = 1
Jedenfalls, bei mir sieht das jetzt ungefaehr genau so aus:
SELECT Wetter, Stufe FROM TabW WHERE ID IN
(Select MAX(ID) FROM TabW WHERE jahr = 2005 and
jahreszeit='Sommer' and Z_ID = 'Z3' GROUP BY Wetter)
ORDER BY DokumentNr
So bekomm ich - anhand der letzten ID des jeweiligen Wetters - halt
immer den letzten Eintrag dessen. Oder so halt, jedenfalls macht's das,
was ich wollte ;)
-- Danke an dieser Stelle nochmal an hier u an die Nachbarn aus
m.p.d.sqlserver! (ich hoffe das geht i.O. - oder haben sich MySQLer u.
MSSQLer ebenso gern wie LINUXer u. WINDOWSer..?!)
> Dieter
Gruesse,
Matze