【问题标题】:SQL: Sort rows based on attribute orderSQL:根据属性顺序对行进行排序
【发布时间】:2018-12-04 16:21:06
【问题描述】:

我想将一个属性的值(称为position)排序到另一个属性排序的行号。

示例:如果我有以下属性:位置,点 我想按点(降序)对表格进行排序,然后分配 position 排序的行号 ex。

Position --- Points

1 ------------ 99

2 ------------ 97

3 ------------ 81

etc..

【问题讨论】:

  • 欢迎来到 Stack Overflow!你会发现如果你花点时间去Stack Overflow tour,你会有更好的体验。您还可以阅读有关询问good question 的信息。如果您遵循 Stack Overflow 社区的规范,并以帮助他人的态度来对待它,它将为您提供良好的服务。
  • 欢迎您!在数学中,“属性的排序数”简称为该属性的“等级”。您想按积分排名对条目进行排序。 MySQL 上有一个例子:https://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql/

标签: sql sql-server database tsql


【解决方案1】:

您可以使用窗口函数 row_number() 来做到这一点

由于 OP 想要更新记录

with data
  as (
    select row_number() over(order by points desc) as rnk_position
           ,position
           ,points
      from leagueParticipantView /* Is this a view or a table*/
     where leagueName LIKE &leagueName
     )
update data
   set position = rnk_position

【讨论】:

  • 我已经尝试过了,但是它抱怨它返回的更新语句不止一行。
  • UPDATE LeagueParticipantView SET position =(SELECT RANK() OVER (ORDER BY points DESC)) WHERE LeagueName LIKE &leagueName 注意:leagueName 是过程的参数
  • 几点,您正在更新视图/还是要更新表格?如果您可以为要更新的表发布创建表语句,这会有所帮助
  • 据我所知,一个视图链接到一个表,就好像我在视图上做任何操作一样,它也会在表上做。我错了吗?
  • 是的,除非它是具有许多连接或 dblink 和一些限制条件的复杂视图
【解决方案2】:

您只是想要row_number() 还是rank()

select row_number() over (order by points desc) as position, points
from t
order by position;

【讨论】:

  • 我已经尝试过了,但是它抱怨它返回的更新语句不止一行。
【解决方案3】:

要获得您需要的排名或职位,您可以简单地使用 RANK() 函数,如下所示:

create table #MyTable (Position int,  Points int)
insert into #MyTable values (0, 99),(0, 97),(0, 89)

SELECT #MyTable.Points,  RANK ()  OVER( ORDER BY Points desc) AS Position
FROM #MyTable

输出如下所示

Points  Position
99      1
97      2
89      3

您可以在更新中使用原始表和具有排名功能的表的内部连接,如下所示。

UPDATE A    
  SET A.Position = B.Position
from #MyTable A
  INNER JOIN (SELECT #MyTable.Points,  RANK ()  OVER( ORDER BY Points desc) AS Position
FROM #MyTable) B ON A.Points = B.Points

更新后可以使用select语句获取更新后的位置,如下图所示

SELECT * FROM #MyTable

Position    Points
1           99
2           97
3           89
drop table #MyTable. 

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2017-01-18
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多