我可以在SQL结果表中获取记录的位置吗?

7 sql sql-order-by

如果我做的事情

SELECT * FROM mytable ORDER BY mycolumn ASC;
Run Code Online (Sandbox Code Playgroud)

我按特定顺序获得结果表.

有没有一种方法在SQL中有效地找出,给定PK,该结果表中的哪个位置将包含我的PK记录?

Guf*_*ffa 22

您可以计算您正在排序的值的值低于您知道键值的记录的值:

select count(*)
from mytable
where mycolumn < (select mycolumn from mytable where key = 42)
Run Code Online (Sandbox Code Playgroud)

  • +1简单且不依赖于ROW_NUMBER().虽然您需要在结果中添加1,或者<to <=. (2认同)
  • 是的,如果您希望该职位基于一,而不是基于零。 (2认同)

And*_*mar 19

在支持它的数据库上,您可以使用ROW_NUMBER()来实现此目的:

SELECT RowNr
FROM (
    SELECT 
         ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr,
         mycolumn
    FROM mytable
) sub
WHERE sub.mycolumn = 42
Run Code Online (Sandbox Code Playgroud)

该示例假设您正在寻找主键42 :)

子查询是必要的,因为类似于:

SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) AS RowNr
FROM mytable
WHERE sub.mycolumn = 42
Run Code Online (Sandbox Code Playgroud)

将永远返回1; 可以这么说,ROW_NUMBER()在WHERE之后工作.

  • 在跳上downvote vagon之前,cuz是'm $ specific'需要一分钟和RTFM.ROW_NUMBER,RANK,DENSE_RANK,PERCENT_RANK和CUME_DIST是ANSI标准SQL-2003中指定的窗口函数,所有主要供应商都支持它们或计划很快支持它们. (4认同)