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

Exclude top and bottom n rows in SQL

我正在尝试查询数据库,但从 table 中排除了第一行和最后一行。这是一个示例 table:

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 和其他一些东西,但无法获得我想要的结果。如果有办法做到这一点(使用 first/last % 而不是 first/last n 更好),我想不通。

如果您使用 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)
;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

你可以试试这个:

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!=(query)

你可以试试这个伙伴:

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