2016-10-07 8 views
2

Ich habe eine Anforderung, die ich alle Zeilen nach ID aggregieren muss, und finden Sie eine bestimmte Zeile unter den Zeilen derselben ID. Es ist wie 2 SQL-Abfragen, aber ich möchte es in 1 SQL-Abfrage machen. Ich verwende Oracle-Datenbank. zum Beispiel Tabelle t1, deren Daten wie folgt aussieht:In Oracle, wie bestimmte Zeile auszuwählen, während alle Zeilen aggregieren

id | name | num 
----- -------- ------- 
1 | 'a' | 1 
2 | 'b' | 3 
2 | 'c' | 6 
2 | 'd' | 6 

ich die Daten von der ID aggregieren möchten, finden Sie das ‚Name‘ mit der höchsten ‚count‘, und alle Zählung der ID Summe zu ‚TOTAL_COUNT ". Es gibt 2 Zeilen mit derselben Nummer, nehmen Sie die erste auf.

id | highest_num | name_of_highest_num | total_num | avg_num 
----- ------------- --------------------- ------------ ------------------- 
1 |  1  |   'a'  |  1  |  1 
2 |  6  |   'c'  |  15  |  5 

Kann ich dieses Ergebnis von 1 Oracle SQL-Abfrage erhalten? Vielen Dank im Voraus für alle Antworten.

Antwort

4

Oracle-Setup:

CREATE TABLE table_name (id, name, num) AS 
SELECT 1, 'a', 1 FROM DUAL UNION ALL 
SELECT 2, 'b', 3 FROM DUAL UNION ALL 
SELECT 2, 'c', 6 FROM DUAL UNION ALL 
SELECT 2, 'd', 6 FROM DUAL; 

Abfrage:

SELECT id, 
     MAX(num) AS highest_num, 
     MAX(name) KEEP (DENSE_RANK LAST ORDER BY num) AS name_of_highest_num, 
     SUM(num) AS total_num, 
     AVG(num) AS avg_num 
FROM table_name 
GROUP BY id 

Ausgang:

ID HIGHEST_NUM NAME_OF_HIGHEST_NUM TOTAL_NUM AVG_NUM 
-- ----------- ------------------- --------- ------- 
1   1 a       1  1 
2   6 d       15  5 
+0

Ich mag diese Antwort besser - +1 – sgeddes

+0

Danke für die Antwort. Sieht perfekt aus! –

1

Klingt, als ob Sie einige analytische Funktionen verwenden möchten. So etwas sollte

select id, 
     num highest_num, 
     name name_of_highest_num, 
     total total_num, 
     average avg_num 
    from (select id, 
       num, 
       name, 
       rank() over (partition by id 
           order by num desc, name asc) rnk, 
       sum(num) over (partition by id) total, 
       avg(num) over (partition by id) average 
      from table t1) 
where rnk = 1 
+0

Danke für die Antwort. Ich denke, die Idee ist richtig, aber wenn ich in SQL-Entwickler lief, sagt es mir ORA-00909: ungültige Anzahl von Argumenten 00909. 00000 - "ungültige Anzahl von Argumenten" * Ursache: * Aktion: Fehler bei Zeile: 11 Spalte: 16. Die Summe() & avg() scheint ein Problem zu haben –

+0

@LL - D'oh, yup. Fehler behoben –

1

eine Option arbeiten hier mit row_number in einer Unterabfrage mit conditional aggregation:

select id, 
    max(num) as highest_num, 
    max(case when rn = 1 then name end) as name_of_highest_num, 
    sum(num) as total_num, 
    avg(num) as avg_num 
from (
    select id, name, num, 
    row_number() over (partition by id order by num desc) rn 
    from a 
) t 
group by id 
+0

Vielen Dank für die gute Antwort. Das Ergebnis ist korrekt. Und es gibt mir eine andere Idee, wie man mit solchen Problemen umgeht. –

Verwandte Themen