如何在sqlite中对表中的行进行排名?

Posted

技术标签:

【中文标题】如何在sqlite中对表中的行进行排名?【英文标题】:How to rank rows in a table in sqlite? 【发布时间】:2017-12-23 13:28:27 【问题描述】:

如何创建一个基于两个或三个键对表的信息进行排序的列? 例如,在此表中,排名变量基于部门和名称:

Dep | Name | Rank 
----+------+------
 1  | Jeff |  1
 1  | Jeff |  2
 1  | Paul |  1
 2  | Nick |  1
 2  | Nick |  2

我找到了this solution,但它在 SQL 中,我认为它不适用于我的情况,因为所有信息都在一个表中,并且响应似乎 SELECT 和 JOIN 组合了来自不同表的信息。 提前谢谢你

【问题讨论】:

请为示例数据提供所需的输出。 如何从两个相关列中确定排名?特别是因为相同的值会为 Jeff 和 Nick 提供两个不同的等级。 嗨@CL。我想要的输出是列Rank 和@Yunnosch,排名是根据部门和名称确定的。所以很多部门可能有多个 Nick,但是 Rank 列需要分别对每个部门的每个 Nick 进行排名 【参考方案1】:

您可以计算当前组中当前行之前的行数:

UPDATE MyTable
SET Rank = (SELECT COUNT(*)
            FROM MyTable AS T2
            WHERE T2.Dep    = MyTable.Dep
              AND T2.Name   = MyTable.Name
              AND T2.rowid <= MyTable.rowid);

rowid 列用于区分其他相同的行。如果有主键,请使用主键。)

【讨论】:

谢谢它完美的工作。我必须首先创建一个rowid 列,到目前为止我还没有这个CREATE TABLE MyTable_ID (id integer primary key autoincrement, department, person); INSERT INTO MyTable_ID (department, person) SELECT department, person FROM MyTable_original; 然后我在表MyTable_ID ALTER TABLE MyTable_ID ADD COLUMN Rank; 中创建了一个额外的列,用于来自@CL 的代码。工作需要将表 MyTable_ID 重命名为 MyTable 你能@CL吗?请解释为什么使用 T2,为什么需要使用临时表 T2 来计算现有表中的列? 没有临时表。 AS 为表名创建别名,因为子查询需要引用两个不同行中的值。

以上是关于如何在sqlite中对表中的行进行排名?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite如何从分隔列文本中对另一个表中的值求和?

对表中的每一行进行排名,并将行分组为重复项,而不重置每个组的排名

如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续

SQL(mysql)排序表并获取其在排序表中的位置的行?

在 LibreOffice Calc 中对不同表中的行(“条件副本”)进行分组

在 Hive 中对表进行分区和分桶有啥区别?