SQL 查询获取主选择查询上的行排名或位置

Posted

技术标签:

【中文标题】SQL 查询获取主选择查询上的行排名或位置【英文标题】:SQL Query get row rank or position on the main select query 【发布时间】:2020-06-14 21:13:45 【问题描述】:

我正在尝试从我的 SELECT 查询中获取特定行的排名。

这是我的桌子:

| PID   | Age   |
|------ |-----  |
| 5295  | 27    |
| 4217  | 26    |
| 2935  | 25    |
| 8706  | 24    |

我的查询和代码:I'm using SQL Server

$x = 0;
$query = odbc_exec($connect, "SELECT * FROM mytable ORDER BY Age DESC"); // Ordering by "Age" Descending
while($row = odbc_fetch_array($query)) 
    $x++;
    if($row['PID'] == 2935)  break; // Stop 


echo $x; // output "3"

此方法有效,但问题是这是否可以通过简单的独立 SQL Query 而不是 looping 通过所有结果然后递增 $x 变量来获得 specified row 等级。因为该表包含数千个条目,在循环时会有点滞后,直到找到所需的行然后停止循环。

这个排名的逻辑,因为我以Age 降序排序,所以例如它将从27 开始,排名124,排名4

我怎样才能做到这一点?

【问题讨论】:

你在使用 mysql 吗?还是 SQL Server? 使用 SQL Server 【参考方案1】:

您可以在子查询中使用row_number() 为每条记录分配排名,然后在外部查询中过滤掉您感兴趣的行:

select *
from (
    select t.*, row_number() over(order by age desc) rn
    from mytable t
) t
where pid = 2935

在 MySQL 中,仅 8.0 版支持窗口函数。在 SQL Server 中,它们已经存在很长时间了。

【讨论】:

以上是关于SQL 查询获取主选择查询上的行排名或位置的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize(或清除 SQL)查询以选择包含 JSON 字段中的值的行?

在Oracle的SQL查询中获取固定数量的行[重复]

SQL查询选择年份在两个日期之间的行

获取联系人在一分钟内有 20 个活动的行 - SQL 查询 [重复]

SQL 选择不同的行,如果为空则忽略行

对分组内的行进行排名(2 列)