Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择顶部行和底部行_Sql_Sql Server_Tsql_Sql Server 2005 - Fatal编程技术网

Sql 选择顶部行和底部行

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

我正在使用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 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)