Distinct/Group By

Actus

Benutzer
Beiträge
5
Hallo, ich bin neu hier im Forum und hätte eine kleine Frage.
Ich möchte folgendes beim query processing umsetzen:

Ich möchte für jeden Distrikt (insg. 17) einer Stadt alle Straßen, welche wirklich nur in dem einen Distrikt sind zählen und zurück bekommen. Also sprich alle Straßen die es in mehreren Distrikten gibt herausfiltern. Mein Problem ist es werden auch die Straßen, die in mehreren Distrikten sind, mitgezählt.

Ich muss dafür 2 tables verwenden (districts(dkey, name, population, area) und streetdistricts(stkey, dkey))

Bis jetzt habe ich das:

select name, area, count(streetdistricts.stkey) as street_count from districts
left join streetdistricts on districts.dkey=streetdistricts.dkey group by districts.dkey;

Ausgegeben werden soll der Name des Distrikts, die Größe, als auch die gezählten Straßen

Hätte da jemand eine Idee?
Vielen Dank im voraus!
 
Werbung:
Um dir den prinzipiellen Weg zu zeigen. Du hast:

Code:
postgres=# create table streetdistricts(stkey int, dkey int);
CREATE TABLE
postgres=# insert into streetdistricts values (1,1);
INSERT 0 1
postgres=# insert into streetdistricts values (1,2);
INSERT 0 1
postgres=# insert into streetdistricts values (2,1);
INSERT 0 1
postgres=# insert into streetdistricts values (3,2);
INSERT 0 1
postgres=# insert into streetdistricts values (4,2);
INSERT 0 1
postgres=# insert into streetdistricts values (4,3);
INSERT 0 1

Und suchst nur stkey's, für die es nur 1 dkey gibt, korrekt?

Code:
postgres=# select stkey, count(dkey) from streetdistricts group by stkey having count(dkey) = 1;
 stkey | count 
-------+-------
     3 |     1
     2 |     1
(2 rows)

Hilft das?
 
Vielen Dank für die Antwort! Das Problem ist ich möchte, dass jeder stkey nur einen dkey hat. Wenn ein stkey mehrere dkeys hat sollen die herausgefiltert werden. Wenn ich den Code von oben ausführe habe ich bei count immer 1 stehen. Ich möchte aber wenn ein Distrikt z.B. 100 Straßen hat, die wirklich nur dort dazu gehören, bei dem count dann 100 stehen haben. Also wenn es 17 Distrikte gibt sollen nur 17 Zeilen ausgegeben werden, name und area als auch für jeden Distrikt einmal der count aller stkeys.
 
Das Problem ist ich möchte, dass jeder stkey nur einen dkey hat. Wenn ein stkey mehrere dkeys hat sollen die herausgefiltert werden.
exakt das macht doch meine Abfrage. Hier noch mal:

Code:
postgres=# select * from streetdistricts ;
 stkey | dkey 
-------+------
     1 |    1
     1 |    2
     2 |    1
     3 |    2
     4 |    2
     4 |    3
(6 rows)

postgres=# select stkey, count(dkey) from streetdistricts group by stkey having count(dkey) = 1;
 stkey | count 
-------+-------
     3 |     1
     2 |     1
(2 rows)

postgres=#

stkey 1 und 4 haben jeweils mehr als 1 dkey und fallen somit raus, übrig bleiben stkey 2 und 3 mit immer nur 1 dkey.
 
Achso okay jetzt habe ich das verstanden danke. Jetzt werden mir alle stkeys angezeigt die nur einen dkey haben. Wie könnte ich jetzt aber meinen districts table einbauen? Mein Ziel ist es ja Districts.name, Districts.area und den streetcount (alle stkeys mit 1 dkey für den jeweiligen 1 distrikt) zurückzubekommen. Die stkeys die nur einen dkey haben sollen nicht angezeigt sondern nur gezählt werden (=streetcount). Ich kann da gerne einmal ein Foto anghängen falls das okay ist. So sollte es am Ende aussehen.
 

Anhänge

  • Screenshot 2022-04-30 134824.png
    Screenshot 2022-04-30 134824.png
    35,1 KB · Aufrufe: 4
Du müsstest das jetzt nochmal zusammen führen und gruppieren. Da gibt es verschiedene Wege, z.B. so:
Code:
select d.dkey, d.name, d.population, d.area, count(s.stkey) as anzahl
from districts d
left join streetdistricts s
on d.dkey = s.dkey
where s.stkey in (
select stkey, count(dkey) from streetdistricts group by stkey having count(dkey) = 1
)
group by d.dkey, d.name, d.population, d.area
Das sollte jedes SQL hin bekommen, könnte aber etwas unperformant werden.
 
Vielen Dank für deine Nachricht! Leider bekomme ich noch einen Error wenn ich deinen Code von oben ausführe:

ERROR: FEHLER: Unteranfrage hat zu viele Spalten LINE 5: where s.stkey in SQL state: 42601 Character: 149
 
Sry habe ich direkt hier rein getippt, probier mal:
Code:
select d.dkey, d.name, d.population, d.area, count(s.stkey) as anzahl
from districts d
left join streetdistricts s
on d.dkey = s.dkey
where s.stkey in (
select stkey from streetdistricts group by stkey having count(dkey) = 1
)
group by d.dkey, d.name, d.population, d.area
 
Werbung:
Vielen Dank! Es funktioniert :)! Ah jetzt bin ich glücklich ich habe das die letzten Tage probiert und nie geschafft. 👍👍👍
 
Zurück
Oben