2016-04-06 11 views
2

Aufgabe:Abfrage Vereinfachung Oracle North

Suche Land, in dem maximalen Kunden gehören.

Abfrage

SELECT country, 
     count(*) 
FROM customers 
GROUP BY country 
HAVING count(*) = 
    (SELECT max(max_sal) 
    FROM 
    (SELECT count(*) max_sal 
     FROM customers 
     GROUP BY country)) ; 

Ergebnis:

enter image description here

Das Ergebnis ist richtig, aber ich denke, dass es schwierig Weg Abfrage

Frage zu schreiben: Gibt es eine einfache Möglichkeit, diese Abfrage neu zu schreiben.

+0

können Sie Fensterfunktionen verwenden? –

+0

@vkp Ich benutze nie Fensterfunktion –

Antwort

2

ich könnte etwas fehlt, aber es kann dies so einfach sein:

SELECT * 
    FROM ( SELECT country, COUNT (*) max_sal 
      FROM customers 
     GROUP BY country 
     ORDER BY COUNT (*) DESC) 
WHERE ROWNUM <= 1; 
1

können Sie WITH-Klausel verwenden:

WITH 
    c AS ( 
    SELECT country, Count(1) n 
    FROM customers 
    GROUP BY country) 
SELECT country, n 
FROM c 
WHERE n = (SELECT Max(n) FROM c) 
1

U analytische Funktion wieder verwenden können() wich u bekommen Ergebnis von max (Durchschnitt, Min., etc ..) auf jeder Reihe von Ergebnis und dann in wo Vergleich zählen (1) und max (Anzahl (1))

hier ist Beispiel:

SELECT country, cnt, max_cnt 
    FROM (SELECT country, COUNT(1) AS cnt, MAX(COUNT(1)) over() max_cnt 
      FROM customers 
      GROUP BY country) 
WHERE cnt = max_cnt 
1
SELECT Country, MAX(N) FROM (
    SELECT Country, COUNT(*) as N FROM CUSTOMERS GROUP BY Country 
);