Sql 选择顶部行和底部行
我正在使用SQL Server 2005,并试图实现以下目标: 我想在同一个select语句中获取前x行和最后x行Sql 选择顶部行和底部行,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我正在使用SQL Server 2005,并试图实现以下目标: 我想在同一个select语句中获取前x行和最后x行 SELECT TOP(5) BOTTOM(5) 当然底部不存在,所以我需要另一个解决方案。我相信有一个简单而优雅的解决方案,我没有得到。使用GROUP BY DESC再次进行选择不是一个选项。检查链接 您是否尝试使用rownumber SELECT * FROM (SELECT *, ROW_NUMBER() OVER (Order BY columnName) as Top
SELECT TOP(5) BOTTOM(5)
当然底部不存在,所以我需要另一个解决方案。我相信有一个简单而优雅的解决方案,我没有得到。使用GROUP BY DESC再次进行选择不是一个选项。检查链接
您是否尝试使用rownumber
SELECT *
FROM
(SELECT *, ROW_NUMBER() OVER (Order BY columnName) as TopFive
,ROW_NUMBER() OVER (Order BY columnName Desc) as BottomFive
FROM Table
)
WHERE TopFive <=5 or BottomFive <=5
然后你就出局了——再次选择是唯一的选择,除非你想得到完整的结果集,然后扔掉中间的所有东西 我所想到的任何sql都是一样的——对于底部,您首先需要知道有多少项实现了所有内容,或者使用count*或反向排序顺序
对不起,如果这不适合你,但最后。。。。现实并不重要,我也看不到任何其他方法可以做到这一点。使用工会是我能想到的实现这一点的唯一方法
select * from (select top(5) * from logins order by USERNAME ASC) a
union
select * from (select top(5) * from logins order by USERNAME DESC) b
我想你必须只使用子查询
select * from table where id in (
(SELECT id ORDER BY columnName LIMIT 5) OR
(SELECT id ORDER BY columnName DESC LIMIT 5)
)
select * from table where id in (
(SELECT TOP(5) id ORDER BY columnName) OR
(SELECT TOP(5) id ORDER BY columnName DESC)
)
编辑
select * from table where id in (
(SELECT TOP 5 id ORDER BY columnName) OR
(SELECT TOP 5 id ORDER BY columnName DESC)
)
你可以选择使用工会吗 例如
我认为你有两个主要的选择:
SELECT TOP 5 ...
FROM ...
ORDER BY ... ASC
UNION
SELECT TOP 5 ...
FROM ...
ORDER BY ... DESC
或者,如果您知道表中有多少项:
SELECT ...
FROM (
SELECT ..., ROW_NUMBER() OVER (ORDER BY ... ASC) AS intRow
FROM ...
) AS T
WHERE intRow BETWEEN 1 AND 5 OR intRow BETWEEN @Number - 5 AND @Number
据我所知,这与工会之间没有真正的区别,但从技术上讲,这是一个单一的查询
select t.*
from table t
where t.id in (select top 5 t2.id from table t2 order by MyColumn)
or
t.id in (select top 5 t2.id from table t2 order by MyColumn desc);
我最近不得不为一个非常大的存储过程这样做;如果您的查询非常大,并且您希望尽可能减少可以声明@entitable的查询量,请插入该@entitable,然后从该@entitable进行查询
DECLARE @tempTable TABLE ( columns.. )
INSERT INTO @tempTable
VALUES ( SELECT.. your query here ..)
SELECT TOP(5) columns FROM @tempTable ORDER BY column ASC -- returns first to last
SELECT TOP(5) columns FROM @tempTable ORDER BY column DESC -- returns last to first
这是sql server,因此您需要在关键字“ORDER”附近使用TOPMsg 156,级别15,状态1,第3行不正确的语法,而不是LIMIT。还有一种使用rownumber的方法。您应该右键单击top 2。@hgulyan:top x是首选方法-它也适用于更新和删除,还允许您编写top 20%或top@limit等。如果您发布代码,请突出显示这些行并单击编辑器工具栏上的代码按钮101 010!此代码将不起作用。Top5和Bottom5不能像这样被引用,您会得到消息207,级别16,状态1,第4行无效的列名“TopFive”。。。如果你把行号。。。在WHERE you get Msg 4108,Level 15,State 1中,第1行窗口函数只能出现在SELECT或ORDER BY子句中。您需要将SELECT和FROM包装在派生表中,并将WHERE to外部查询拉入其中,以使其工作,如.Edited查询。这是一个很大的错误。这将像一只没有腿的狗一样奔跑。使用UNION@gbn我认为这取决于-在我的例子中,对比2个查询的执行计划,UNION版本的运行速度几乎慢了2倍-65%与35%的查询成本相对,而只提供代码答案是可以接受的,如果您还可以对代码进行解释并帮助人们理解代码解决问题的原因,那么它通常对社区更有用。这可以减少后续问题的数量,并帮助新开发人员理解底层概念。你介意用更多的细节更新你的问题吗?
DECLARE @tempTable TABLE ( columns.. )
INSERT INTO @tempTable
VALUES ( SELECT.. your query here ..)
SELECT TOP(5) columns FROM @tempTable ORDER BY column ASC -- returns first to last
SELECT TOP(5) columns FROM @tempTable ORDER BY column DESC -- returns last to first
SELECT *
FROM (
SELECT x, rank() over (order by x asc) as rown
FROM table
) temp
where temp.rown = 1
or temp.rown = (select count(x) from table)