排除 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
)
);
我正在尝试查询数据库,但从 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
)
);