我的餐桌如下所示

location   rank
location_A 1
location_B 2
location_C 3
location_D 4
location_E 5
location_F 6
・
・
・

并且,最近位置=location_E,第二个最近位置=location_D 所以我想要下面的中餐桌

location    rank
location_E  1
location_D  2

我的预期结果如下:location_Elocation_D将其排名移动为12,其余位置保持其order但滑动其rank

location    rank
location_E  1
location_D  2
location_A  3
location_B  4
location_C  5
location_F  6
・
・

有什么好方法可以实现这一点吗? 谢谢

推荐答案

try 使用带有条件ORDER BY子句的RANK函数执行以下操作:

SELECT location,
       RANK() OVER (ORDER BY CASE 
                             WHEN location = 'location_E' THEN 1
                             WHEN location = 'location_D' THEN 2
                             ELSE 3
                             END, rank_) rank_
FROM table_name

如果您想用新的排名更新您的表,请try 以下操作:

WITH ranks AS
(
  SELECT location,
       RANK() OVER (ORDER BY CASE 
                                   WHEN location = 'location_E' THEN 1
                                   WHEN location = 'location_D' THEN 2
                                   ELSE 3
                                   END, rank_) rank_
  FROM table_name
)

UPDATE table_name T
SET rank_ = R.rank_
FROM ranks R
WHERE T.location = R.location;

请看demo.

Sql相关问答推荐

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

具有2个共享列的两个表的Amazon RSQL合并

在SQL中使用类别值将行转置为列

部分匹配表中元素的MariaDB查询查找结果

通过之前的连接-这是Oracle的错误吗?

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

查找表中特定值的上次更新日期

Pgsql-返回包含多行数据的行

重用传递给 node 的参数-postgres upsert查询

TSQL如何为群分配号码

如何用HeidiSQL在Firebird中设置超时?

Select 最频繁的值以及分组依据

查询以从时间范围列表中查找唯一时间段

Select 一个非零值减少重复

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

SQL Server:时态表并在运行时添加计算列

使用 regexp_replace 替换所有出现的特殊字符

运算符不存在:integer = bigint[]

查找距上一条记录大于或等于 30 天的记录