SQL - min() 获得最低值,max() 获得最高值,如果我想要第二个(或第五个或第 n 个)最低值怎么办?

标签 sql postgresql

我要解决的问题是我有一个这样的表:

a 和 b 指的是不同表上的点。 distance 是点之间的距离。

| id | a_id | b_id | distance | delete |
| 1  |  1   |   1  |  1       |   0    |
| 2  |  1   |   2  |  0.2345  |   0    |
| 3  |  1   |   3  |  100     |   0    |
| 4  |  2   |   1  |  1343.2  |   0    |
| 5  |  2   |   2  |  0.45    |   0    |
| 6  |  2   |   3  |  110     |   0    |
....

我要查找的重要列是 a_id。如果我想为每个 a 保留壁橱 b,我可以这样做:

update mytable set delete = 1 from (select a_id, min(distance) as dist from table group by a_id) as x where a_gid = a_gid and distance > dist;
delete from mytable where delete = 1;

这会给我一个这样的结果表:

| id | a_id | b_id | distance | delete |
| 1  |  1   |   1  |  1       |   0    |
| 5  |  2   |   2  |  0.45    |   0    |
....

即每个 a_id 值都需要一行,并且该行应该具有每个 a_id 的最小距离值。

但是我想为每个 a_gid 保留 10 个最接近的点。我可以使用 plpgsql 函数执行此操作,但我很好奇是否有更多 SQL-y 方法。

min() 和 max() 返回最小值和最大值,如果有像 nth() 这样的聚合函数,它会返回第 n 个最大/最小值,那么我可以按照与上述类似的方式执行此操作。

我正在使用 PostgeSQL。

最佳答案

试试这个:

SELECT  *
FROM    (
    SELECT  a_id, (
        SELECT b_id
        FROM mytable mib
        WHERE mib.a_id = ma.a_id
        ORDER BY
            dist DESC
        LIMIT 1 OFFSET s
        ) AS b_id
    FROM    (
        SELECT DISTINCT a_id
        FROM mytable mia
        ) ma, generate_series (1, 10) s
    ) ab
WHERE   b_id IS NOT NULL

在 PostgreSQL 8.3 上检查

关于SQL - min() 获得最低值,max() 获得最高值,如果我想要第二个(或第五个或第 n 个)最低值怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502794/

相关文章:

ruby-on-rails - Broken Rails setup/pg gem

arrays - 将数组的数组作为参数传递给函数

PostgreSQL order by month name on distinction

SQL 日期差异工作日

java - Java中获取不在数据库中的对象列表的有效方法

php - 将Mysql文本转换为日期

java - 找不到正确的匹配时,java程序崩溃

sql - 在 postgresql 中对一个非常大的表进行分页和过滤(键集分页?)

SQL 计算参数定义的唯一对象

r - 在 R 中查询 PostgreSQL 数据库时如何修复警告消息 "Closing open result set, cancelling previous query"?