Select beliebige Zeile aber nicht wenn...

Michi_R

Fleissiger Benutzer
Beiträge
81
Hallo zusammen,

hier ein Beispiel (Grundsätzlich kann in Spalte A alles aus ein oder mehreren Buchstaben stehen)
A | B
-------------------
B | 1
A | 2
B | 500
A | 12
C | 100

Ich möchte aus dieser Tabelle genau eine beliebige Zeile haben => Da könnte ich über Row_num=0 einfach die erste nehmen.

ABER:
Falls ein B drin vorkommt, will ich auf keinen Fall die Zeile mit B als Ergebnis erhalten.
Ein Sort asc macht keinen Sinn, da auch möglich ist, dass kein A vorkommt => Dann wäre B die erste.
Ein Sort mit desc macht auch keinen Sinn, weil wenn ein A vorkommt und kein C, wäre wieder B oben.
Ein Filter auf B macht keinen Sinn, weil wenn nur Bs drin sind, will ich eine beliebige Zeile mit B.

Kann wer helfen?
Danke schon mal.
 
Werbung:
Code:
ORDER BY ( CASE WHEN spalteA = 'B' THEN 1 ELSE 0 END ) ASC
Das ließe sich auch mit weiteren Kritierien kombinieren und auch in ein ROW_NUMBER() einbetten.
 
Danke, da habe ich hinbekommen. Problem ist, ich hab in meinem Beispiel nicht die gesamte Komplexität abgebildet, die ich eigentlich habe.
Den Order by und die rownumber habe ich hinbekommen, aber meine Daten sehen so aus:

A | B |ID
-------------------
B | 1|5
A | 2 |5
B | 500|5
A | 12|5
C | 100|5
B | 1|7
A | 2 |7
B | 500|7
A | 12|7
C | 100|7

Ausgegeben werden sollen 2 Zeilen, nämlich für jede id nach obigem Filter. Ich weiß ich brauche einen Group by, aber ich weiß nicht wie ich das verschachteln soll :(
 
Ich versteh es nicht. Im ersten Post war die Rede von exakt einer Zeile, jetzt plötzlich 2.

Mir scheint, Du willst zuerst einmal B ausfiltern und davon dann eine beliebige Zeile. Vielleicht so:

select id, min(b) from <table> where a != 'B' group by id

Falls nicht: zeige bitte NACHVOLLZIEHBARE Beispiele.
 
Sorry, mein Beispiel war schlecht. Hier ein neues. Ich will nicht nach B filtern, denn wenn es nur B gibt will ich die Zeile haben, aber nun:

upload_2016-11-21_16-23-22.png

(ganz links ist nur die Zeilennummer von Excel)
Die Ebenen innerhalb einer ID können komplett gleich sein, sich komplett oder auch nur teilweise unterscheiden. Für Ebene 1 können natürlich weitere Buchstaben auftreten. Das Kriterium das vermieden werden soll ist alleridngs immer nur 'B'.

Ich möchte eine Gruppierung nach ID.
Für jeden ID-Block möchte ich eine Zeile. Welche ist egal, aber Ebene 1 soll nicht 'B' sein.
Gibt es für eine ID nur Einträge (oder auch nur einen Eintrag) mit Ebene 1 = 'B', dann möchte ich irgendeine Zeile mit B für diese ID.

Als Ergebnis wäre also möglich:
Für ID=1 Zeile 2 oder 3
Für ID=2 Zeile 6 oder 7 oder 8
Für ID=3 Zeile 9

Das Ergebnis muss also so viele Zeilen umfassen wie ich unterschiedliche IDs habe.

Hoffe jetzt ist meine Anforderung eindeutig. Danke euch schon mal :)
 
Hoffe jetzt ist meine Anforderung eindeutig. Danke euch schon mal

Mit genügend krimineller Energie zur Anwendung von Row_number ...

Code:
test=*# select * from michi ;
 id | e1 | e2 | e3 | e4
----+----+----+----+----
  1 | b  | a  | a  | y
  2 | a  | e  | e  | e
  2 | a  | e  | a  | a
  2 | c  | a  | b  | a
  3 | b  | w  | w  | e
  1 | a  | a  | a  | a
  1 | a  | a  | a  | x
  1 | b  | c  | d  | e
(8 Zeilen)

test=*# select id, e1, e2, e3, e4 from (select *, row_number() over (partition by id order by case when e1 = 'b' then 1 else 0 end, case when e2 = 'b'then 1 else 0 end, case when e3 = 'b' then 1 else 0 end, case when e4 = 'b' then 1 else 0 end) from michi order by id) foo where row_number = 1;
 id | e1 | e2 | e3 | e4
----+----+----+----+----
  1 | a  | a  | a  | a
  2 | a  | e  | a  | a
  3 | b  | w  | w  | e
(3 Zeilen)
 
Sieht vielversprechend aus, TOAD unterringelt mir allerdings die Stelle "*," rot mit dem Hinweis "Found ',': Expecting: ."
Ist das eine Einstellung bei mir im TOAD?

Weiterhin: Es ist nur relevant, ob 'b' in der e1-Spalte steht, in den anderen Spalten ist es egal. Aber dafür reichts ja wenn ich alle case-Statements bis auf den ersten raus nehme, richti?
 
Auch Oracle sollte mit der Syntax klar kommen, das * sollte man sowieso ersetzen in produktivem Code:
Code:
select id, e1, e2, e3, e4 from (
select id, e1, e2, e3, e4, row_number() over (partition by id order by (case when e1 = 'b' then 1 else 0 end)) AS row from michi
) foo where row = 1;
 
Werbung:
Größter Dank sei euch beiden! Das hat jetzt funktioniert.

(Vollständigkeitshalber erwähne ich noch, dass 'row' durch irgendetwas anderes zu ersetzen ist, weil es ein reserviertes Wort darstellt).
 
Zurück
Oben