选择顶行和底行

时间:2010-05-28 08:04:41

标签: sql sql-server tsql sql-server-2005

我正在使用SQL Server 2005而我正在努力实现以下目标: 我想在同一个select语句中获取前x行和最后x行。

SELECT TOP(5) BOTTOM(5)

当然BOTTOM不存在,所以我需要另一个解决方案。我相信有一个简单而优雅的解决方案,我没有得到。使用GROUP BY DESC再次进行选择不是一种选择。

9 个答案:

答案 0 :(得分:22)

使用联盟是我能想到的唯一能实现这个目标的东西

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

答案 1 :(得分:8)

检查链接

SQL SERVER – How to Retrieve TOP and BOTTOM Rows Together using T-SQL

您是否尝试使用row_number?

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

http://www.sqlservercurry.com/2009/02/select-top-n-and-bottom-n-rows-using.html

答案 2 :(得分:7)

我认为你有两个主要选择:

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

答案 3 :(得分:3)

您可以选择使用工会吗?

E.g。

select top 5 ... order by {specify columns asc} 
union 
select top 5 ... order by {specify columns desc}

答案 4 :(得分:2)

这与我所知道的联盟之间没有真正的区别,但从技术上讲,它只是一个查询。

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);

答案 5 :(得分:1)

然后你出去了 - 再做一次选择是唯一的选择,除非你想要拉入完整的结果集然后丢掉它们之间的所有内容。

任何sql我都会想到同样的方式 - 对于底层你需要首先知道你拥有多少项(实现所有项目或使用count(*))或反向排序顺序。

很抱歉,如果这不适合你,但最后......现实并不关心,我也没有看到任何其他方法。

答案 6 :(得分:1)

我猜你必须使用子查询

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) 
  )

EDITED

select * from table where id in ( 
           (SELECT TOP 5 id ORDER BY columnName) OR 
           (SELECT TOP 5 id ORDER BY columnName DESC) 
  )

答案 7 :(得分:0)

我最近必须做一个非常大的存储过程;如果您的查询非常大,并且想要最小化可以声明@tempTable的查询量,请插入@tempTable然后从@tempTable查询,

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

答案 8 :(得分:0)

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)