在SQL Server中如何取出倒数第二行只包含一个select的数据?

12 浏览
0 Comments

在SQL Server中如何取出倒数第二行只包含一个select的数据?

我试图使用SQL Server选择倒数第二行。所以我写了一个像这样的查询语句:

SELECT TOP 1 * From Cinema 
WHERE CinemaID!=(SELECT TOP 1 CinemaID 
                 FROM Cinema
                 ORDER BY CinemaID DESC)                      
ORDER BY CinemaID DESC 

并且它完成了我需要的功能。但是我想用只有一个select的方式来实现同样的功能。

我了解到MySql中的LIMIT子句可以做到这一点。但我找不到类似的等价物。

所以我感激任何有关寻找有用信息的帮助。

0
0 Comments

问题的原因是在SQL Server中,窗口函数(如rank())只允许在select或order by子句中使用,不能在where子句中使用。因此,代码中的WHERE r = 2是无法正常工作的。

解决方法是将窗口函数的结果作为子查询的一部分,并在外部查询中使用where子句。这样可以避免直接在where子句中使用窗口函数。

具体的解决方法如下:

SELECT * FROM (SELECT row_number() OVER (ORDER BY col) r, * FROM tbl) q

WHERE r = 2

通过这种方式,我们可以取得需要的结果,而不会遇到窗口函数无法在where子句中使用的问题。

通过这个问题和解决方法的讨论,我们可以了解到SQL Server中窗口函数的使用限制,以及如何通过子查询来解决这个问题。这对于正在使用SQL Server的开发人员和数据库管理员来说是一个有价值的知识点。

0
0 Comments

问题的出现的原因:从上述内容中可以看出,问题的出现是因为需要在SQL Server中选择倒数第二行。

解决方法:最好的方法是使用CTE(Common Table Expression)和ROW_NUMBER函数来解决。通过使用这个方法,您可以很容易地获得第二高的值,或者第五高的值,或者前三行等等。CinemaID值只是按顺序编号以供您使用。

整理后的文章如下:

在SQL Server中选择倒数第二行的最好方法(并与ANSI SQL标准兼容)是使用CTE(Common Table Expression)和ROW_NUMBER函数:

;WITH OrderedCinemas AS
(
   SELECT 
       CinemaID, CinemaName, 
       ROW_NUMBER() OVER(ORDER BY CinemaID DESC) AS 'RowNum'
   FROM dbo.Cinema
)
SELECT 
   CinemaID, CinemaName
FROM OrderedCinemas
WHERE RowNum = 2

通过使用这个构造,您可以很容易地获得第二高的值 - 或者第五高的值(`WHERE RowNum = 5`)或者前三行(`WHERE RowNum <= 3`)或者任何您需要的值 - CinemaID值只是按顺序编号以供您使用。

0
0 Comments

问题出现的原因:

这个问题的出现是因为需要在一个select语句中获取倒数第二行的数据。在SQL Server中,没有直接的方法来实现这个目标,因此需要使用嵌套查询和排序来实现。

解决方法:

为了获取倒数第二行的数据,可以使用嵌套查询和排序的方法。首先,在内部查询中,通过将表按照CinemaID降序排序,并使用TOP 2限制结果集为前两行。然后,在外部查询中,再次按照CinemaID排序,并使用TOP 1限制结果集为第一行。这样就可以得到倒数第二行的数据。

下面是解决方法的代码实现:

SELECT TOP 1 * From
(select Top 2 * from Cinema ORDER BY CinemaID DESC) x                     
ORDER BY CinemaID

需要注意的是,这个方法只适用于表中至少有两行数据的情况。如果表中只有一行数据,这个方法可能返回错误的结果。

0