2011-07-06 7 views
3

私には、給与と呼ばれる列で構成されるdepartmentsという表があります。今私は、各部門で最高の2つの給料の詳細をすべて知りたいと思っています。必要な出力が得られるクエリをどのように作成する必要がありますか?上位Nの分析は全体としてはそれを与えるが、各部門ではない。私は各部門のトップ2を欲しい。各部門の最初の2つの給料

答えて

5

私はOracleでこのことを尋ねました。私はそこにお手伝いできない。

しかし、おそらくMSSQL/TSQLのソリューションが表示されたら、それは役に立ちますか?

select 
    d.Salary 
    ,d.Department 
from 
(
    select 
     r.Salary 
     ,r.Department 
     ,row_number() over(
      partition by r.Department 
      order by r.Salary desc) as RowNumber 
    from HumanResources as r 
) as d 
where d.RowNumber < 3 

最高の運!

+1

+1:O racleは、9i(実際には8iですが、詳細は覚えていません)以降の分析関数をWITH句とともにサポートしています(Oracleはそれを「サブクエリ分解」と呼んでいます)。 –

+3

これはOracleで書かれているとおりに動作します。しかし、 'rownumber'よりも' rank'を使うほうが望ましいかもしれません。 'rownumber'は常に2行戻ってくることを保証しますが、最高給与が5人の間で同じであれば、一貫性を保証せずに半ランダムに2行を取得します。同じシナリオでは、 'rank'はすべての5を一貫して返します。 – Allan

+0

Allan、あなたがコメントで共有したように、上記の質問を「ランク」と共有していただけますか –

0
DECLARE @TV_SAL TABLE (EMPID INT, DEPTID CHAR(10),SAL INT) 

INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(4,'OR',1004)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(5,'OR',1005)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(1,'OR',1001)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(2,'OR',1002)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(17,'CS',1503)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(18,'CS',1503)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(14,'CS',1500)  
INSERT INTO @TV_SAL(EMPID,DEPTID,SAL) VALUES(15,'CS',1501) 

SELECT * 
    FROM @TV_SAL A  
WHERE (SELECT COUNT(DISTINCT(SAL)) 
      FROM @TV_SAL B 
      WHERE A.SAL <= B.SAL 
      AND A.DEPTID = B.DEPTID 
       ) <= 3 -- Replace this with 1 ,2 or n , n indicates top n 
ORDER BY DEPTID, SAL DESC 
+0

あなたのコードにいくつかのコメントを追加するにはどうしたらいいですか?どのように各部門のトップを取得しますか? – Yaroslav

-2

SELECT TOP 5 b.DepartName、

がb.DepartName ORDER BYによってa.DepartId = b.DepartId

基上

カテゴリーBをJOIN社員FROM a.Salary a.Salary DESC

これはSqlサーバーで正常に動作し、Oracleについて認識していません

関連する問題