[Oracle] Distinct/Group by über mehrere Spalten

Mustermantz

Grünschnabel
Hallo Forum,

Ich habe ein kleines SQL-Problem, vielleicht kannmir hier jemand helfen.
Ausgangspunkt ist folgende Situation (Ausschnitt):

Code:
ID | Year |  Factor1 | Number1 | Number2
1  | 2010 |   213    |    1     |   1     
2  | 2010 |   213    |    1     |   2    
3  | 2010 |   214    |    2     |   1    
4  | 2010 |   214    |    2     |   2    
5  | 2010 |   210    |    3     |   1    
6  | 2010 |   210    |    3     |   2   
7  | 2011 |   250    |    3     |   5 
8  | 2012 |   214    |    2     |   4

Ich muss praktisch eine Abfrage gestalten, welche mir die Spalte mit den niedrigsten Werten (Number1, Number2) abfrägt, die in der Kombination aus Year und Factor1 auftritt, sprich das Ergebnis der Abfrage soll so aussehen:

Code:
ID | Year |  Factor1 | Number1 | Number2
1  | 2010 |   213    |    1     |   1     
3  | 2010 |   214    |    2     |   1    
5  | 2010 |   210    |    3     |   1    
7  | 2011 |   250    |    3     |   5 
8  | 2012 |   214    |    2     |   4

Vielleicht kann mir hier jemand einen Denkanstoss geben, ich suche schon seit mehreren Tagen eine Lösung, sehe aber wohl im Moment vor lauter Wald die Bäume nicht mehr..

Vielen Dank im Voraus für die Hilfe.

Gruß
M.
 
MIN() und dann zurückverknüpfen

Ich hatte mal etwas für MySQL geschrieben. Das funktioniert ungefähr so auch in Oracle. Du must einfach noch das MIN() durch MAX() ersetzen
MySQL Aktuelle Einträge pro Gruppe auslesen

Was du dir noch überlegen musst, ob der folgende Fall vorkommen kann und wenn ja, welche Daten dann angezeigt werden sollten
Code:
ID | Year |  Factor1 | Number1 | Number2
1  | 2010 |   213    |    2     |   1     
2  | 2010 |   213    |    1     |   2  
3  | 2010 |   213    |    1     |   3
 
Nein der Fall darf nicht vorkommen, es muss die kleinste Kombination aus Number1 und Number2 genommen werden, in diesem Fall ID 2.

Es geht genau darum, solche Duplikate zu entfernen. Ich benötige immer nur die niedrigste Number1 und die passende niedrigste Number2 (also Kombination) aus beiden passend zu der Kombination aus Year und Factor1 (die darf nur einmal vorkommen).

Ist schwer zu beschreiben, deswegen hab ich das ja anhand der Beispiele gemacht.
 
Zuletzt bearbeitet:
Nicht ganz einfach.

Ich habe in meinem Beispiel das Feld yeat als Feld y drin. Year ist kein guter Feldname da es einem SQL.Vefehl entspricht.

SQL:
SELECT 
  tab.*
FROM
  t33 tab
  INNER JOIN (
    SELECT
      m1.y,
      m1.factor1,
      m1.min_1,
      m2.min_2
    FROM
      (
        SELECT
          y,
          factor1,
          MIN(number1) AS min_1
        FROM
          t33 tab
        GROUP BY
          y,
          factor1
      ) m1
      INNER JOIN (
        SELECT 
              y,
              factor1,
              number1,
              MIN(number2) AS min_2
            FROM 
              t33
            GROUP BY
              y,
              factor1,
              number1
        ) m2
      ON m1.y = m2.y
      AND m1.factor1 = m2.factor1
      AND m1.min_1 = m2.number1
    ) sel
      ON tab.y = sel.y
      AND tab.factor1 = sel.factor1
      AND tab.number1 = sel.min_1
      AND tab.number2 = sel.min_2
 
Zuletzt bearbeitet von einem Moderator:
Scheint zu funktionieren, vielen Dank!
Prinzip verstehe ich auch, muss mir das aber in einer ruhigen Minute nochmal zu Gemüte führen, Joins sind nicht meine Stärke :-/
Hast mir aber sehr viel weitergeholfen :)

Gruß
M
 

Neue Beiträge

Zurück