在SQL中排除顶部和底部的n行

时间:2015-02-26 19:18:03

标签: mysql sql pdo

我正在尝试查询数据库,但不包括表中的第一行和最后一行。这是一个示例表:

id | val
--------
 1    1
 2    9
 3    3
 4    1
 5    2
 6    6
 7    4

在上面的示例中,我首先要按val排序,然后排除查询的第一行和最后一行。

id | val
--------
 4    1
 5    2
 3    3
 7    4
 6    6

这是我想要的结果集。注意第1行和第2行被排除,因为它们分别具有最低和最高val

我已经考虑过LIMIT,TOP和其他一些东西,但无法得到我想要的结果。如果有一种方法可以做到(使用第一个/最后一个%而不是第一个/最后一个n更好),我无法弄明白。

4 个答案:

答案 0 :(得分:6)

你可以尝试这个伴侣:

SELECT * FROM numbers
WHERE id NOT IN (
    SELECT id FROM numbers
    WHERE val IN (
        SELECT MAX(val) FROM numbers
    ) OR val IN (
        SELECT MIN(val) FROM numbers
    )
);

答案 1 :(得分:3)

你可以试试这个:

Select * 
from table
where 
val!=(select val from table order by val asc LIMIT 1) 
and 
val!=(select val from table order by val desc LIMIT 1)
order by val asc;

您也可以使用UNION并避免使用2 val!=(查询)

答案 2 :(得分:0)

如果您使用UNION并排除您不想要的val,该怎么办?像下面的东西

select * from your_table
where val not in (
select top 1 val from your_table order by val

union

select top 1 val from your_table order by val desc)

答案 3 :(得分:-1)

;WITH cte (id, val, rnum, qty) AS (
    SELECT  id
    ,       val
    ,       ROW_NUMBER() OVER(ORDER BY val, id)
    ,       COUNT(*) OVER ()
    FROM    t
)
SELECT  id
,       val
FROM    cte
WHERE   rnum BETWEEN 2 AND qty - 1