如何确定sql结果集中行的位置?

时间:2009-07-03 13:58:09

标签: sql count

我有一个SQL查询:

select id, name from table order by name

结果如下:

52 arnold 
33 berta 
34 chris 
47 doris
52 emil

对于给定的id = 47,我如何确定结果集中的位置? 结果应该是4因为:

52 arnold
33 berta
34 chris

在before(47,doris)之前,id = 41在结果集的第4个位置。

如何在SQL中执行此操作? 怎么用HQL? 在一个分页示例中,我是否必须执行2个语句,或者是否有一个解决方案,我可以准确检索包含id = 47的行的窗口?

postgreSQL和java

5 个答案:

答案 0 :(得分:11)

之前的帖子是正确的。如果使用Microsoft SQL Server 2005或更高版本,请使用ROW_NUMBER。

但是,您的标记未指定您正在使用MSSQL,因此这里的解决方案应适用于大多数RDBMS实现。实质上,根据外部查询的ORDER子句的值,使用相关子查询来确定同一集合中小于当前行的行数。像这样:

SELECT      T1.id,
            T1.[name],
            (SELECT COUNT(*) 
             FROM table T2 
             WHERE T2.[name] < T1.[name]) + 1 AS rowpos
FROM        table T1
ORDER BY    T1.[name]

答案 1 :(得分:3)

您没有提到您正在运行的RDBMS,但如果您使用的是SQL Server 2005或更高版本,则可以使用ROW_NUMBER()函数 - 如下所示:

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM   MyTable

然后,要获取给定的行,您可以使用派生表或公用表表达式 - 如下所示:

;WITH NumberedRows
AS
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM    MyTable)
SELECT RowNumber FROM NumberedRows WHERE id = 47

要整理记录所在的“哪个页面”,您需要将行号除以每页的记录数,然后向上舍入到最接近的整数。

答案 2 :(得分:2)

假设SQL 2005,您可以使用Row_Number

答案 3 :(得分:1)

答案取决于您使用的SQL版本。

如果您使用的是MSSQL 2005,则可以使用新的分析函数ROW_NUMBER(),它按照order by子句的顺序生成序列号。 ROW_NUMBER()函数的语法是:

ROW_NUMBER()OVER(ORDER BY)

ROW_NUMBER()OVER(PARTITION BY)

如果您使用的是旧版本的SQL Server,则可以使用标识列创建临时表,并从中选择结果。

答案 4 :(得分:1)

使用Row_Number