Domanda

Come potrei ottenere N risultati per diversi gruppi in una query oracolo.

Ad esempio, data la seguente tabella:

|--------+------------+------------|
| emp_id | name       | occupation |
|--------+------------+------------|
|      1 | John Smith | Accountant |
|      2 | Jane Doe   | Engineer   |
|      3 | Jack Black | Funnyman   |
|--------+------------+------------|

Ci sono molte più righe con più occupazioni. Vorrei ottenere tre impiegati (diciamo) per ogni occupazione.

C'è un modo per farlo senza usare una sottoquery?

È stato utile?

Soluzione

Questo produce ciò che desideri e non utilizza funzioni SQL specifiche del fornitore come TOP N o RANK ().

SELECT MAX(e.name) AS name, MAX(e.occupation) AS occupation 
FROM emp e 
  LEFT OUTER JOIN emp e2 
    ON (e.occupation = e2.occupation AND e.emp_id <= e2.emp_id) 
GROUP BY e.emp_id 
HAVING COUNT(*) <= 3 
ORDER BY occupation;

In questo esempio fornisce ai tre dipendenti i valori emp_id più bassi per occupazione. È possibile modificare l'attributo utilizzato nel confronto delle disuguaglianze, per fare in modo che i migliori dipendenti vengano chiamati per nome o altro.

Altri suggerimenti

Al momento non ho un'istanza di Oracle a portata di mano, quindi non ho provato questo:

select *
from (select emp_id, name, occupation,
      rank() over ( partition by occupation order by emp_id) rank
      from employee)
where rank <= 3

Ecco un link su come funziona il ranking: http://www.psoug.org/reference /rank.html

Aggiungi RowNum al rango:

select * from 
         (select emp_id, name, occupation,rank() over ( partition by occupation order by emp_id,RowNum) rank   
                      from employee) 
         where rank <= 3 

testato questo in SQL Server (e usa la subquery)

select emp_id, name, occupation
from employees t1
where emp_id IN (select top 3 emp_id from employees t2 where t2.occupation = t1.occupation)

esegui un ORDINE nella sottoquery per soddisfare le tue esigenze

Non sono sicuro che questo sia molto efficace, ma forse un punto di partenza?

select *
from people p1
    join people p2
        on p1.occupation = p2.occupation
    join people p3
        on p1.occupation = p3.occupation
        and p2.occupation = p3.occupation
where p1.emp_id != p2.emp_id
    and p1.emp_id != p3.emp_id

Questo dovrebbe darti righe che contengono 3 impiegati distinti tutti nella stessa occupazione. Sfortunatamente, ti darà TUTTE le combinazioni di quelle.

Qualcuno può abbatterlo per favore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top