【问题标题】:rank values based on column entry type根据列条目类型对值进行排名
【发布时间】:2017-10-25 16:21:34
【问题描述】:

我有一个 sql 查询,它对名为“Total”的列的值进行排名,并在名为“Rank”的计算列中返回结果。查询如下:

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));

它给出了以下结果:

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

我想编写一个查询来对总列进行排名,但仅基于语言类型。所以由于我有两种语言,它将对总列进行排名,并仅返回法语条目和单独排名的值仅限英文条目.. 这样输出将如下所示:

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

所有建议将非常感激。谢谢。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: java sql sqlite


【解决方案1】:

通常的排名方式是使用 ANSI 标准的窗口函数:

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;

在 SQLite 中,你可以这样做:

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;

【讨论】:

  • 我正在使用 sqlite3 dbms
【解决方案2】:

谢谢你,Gordon.. 你对 dense_rank() 替代品的查询没有成功,但我选择了我的一个重要部分,那就是 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

非常感谢老板。

【讨论】:

    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多