2017-10-25 17 views
0

「Total」という列の値をランク付けし、結果を「Rank」という計算列に返すSQLクエリがあります。唯一の言語type..soに基づいて列エントリ型に基づくランク値

| NAME | LANGUAGE | TOTAL | RANK| 
------------------------------------------------------ 
| james|French |70.0|2nd | 
| jimmy|English |90 |1st | 
| josh|French |60 |3rd | 
| john|English |40 |4th | 

iが総列をランク付けしますクエリを書きたいけど:

String sql ="select s1.Name as 'NAME',s1.Lang as 'LANGUAGE'," 
      + "s1.Total as 'TOTAL',COUNT(DISTINCT s2.Total) AS Rank from Type1 s1 JOIN Type1 s2 on(s1.Total<=s2.Total) GROUP BY s1.ID order by s1.Name ASC "; 

    pst=conn.prepareStatement(sql); 
    rs=pst.executeQuery(); 
    table_statistics1.setModel(DbUtils.resultSetToTableModel(rs)); 

をし、それは以下の結果を与える:次のようにクエリがあります私は、言語の2種類がありますので、合計列をランク付けし、フランス語のみのエントリーと英語のみのエントリのための別々のランクの値を返します。.. 出力は以下のようになりますように:

| NAME | LANGUAGE | TOTAL | RANK| 
------------------------------------------------------ 
| james |French |70.0 |1st | 
| jimmy |English |90  |1st | 
|josh |French |60  |2nd | 
|john |English |40  |2nd | 

すべての提案は非常に感謝しています。ありがとうございました。

+0

あなたの質問に使用しているデータベースをタグ付けしてください。 –

答えて

1

ランクへの通常の方法は、ANSI標準のウィンドウ関数を使用します:SQLiteので

select t.Name, t.Lang as LANGUAGE, t.Total, 
     dense_rank() over (Partition by t.lang order by t.total) as rnk 
from Type t; 

を、あなたが行うことができます:

select t.*, 
     (select count(distinct t2.total) 
     from t t2 
     where t2.lang = t.lang and t2.total <= t.total 
     ) as rnk 
from Type t; 
+0

例外エラーが発生する@Gordon Linoff –

+0

sqlite3 dbmsを使用しています –

1

あなたゴードンありがとう.. DENSE_RANKためのクエリ()の代替didntは動き出すが、私は私の中で欠けていた重要な部分をとり、それはt2.lang=t.lang 最後の作業コードは

SELECT S1.*,COUNT(DISTINCT s2.Total) AS Rank from Type s1 JOIN Type s2 on(s2.lang=s1.lang and s1.Total<=s2.Total)GROUP BY s1.ID order by s1.Name ASC 

大変ありがとうございます。

関連する問題