如何在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中对表中的行进行排名?的主要内容,如果未能解决你的问题,请参考以下文章
对表中的每一行进行排名,并将行分组为重复项,而不重置每个组的排名
如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续