得到最近的邻居,然后排序

时间:2018-01-17 08:56:15

标签: sql postgresql

我有一个包含以下相关列的表:

index | name
------------
1       John
2       Steve
3       Bill
4       Dave
5       Bart

我想选择索引小于4的前两个最接近的名称,我希望这些结果按索引递增排序。所以我想选择:

index | name
------------
2       Steve
3       Bill

我提出了以下问题:

SELECT index, name
FROM (
    SELECT index, name
    FROM my_table
    WHERE index < 4
    ORDER BY index DESC
    LIMIT 2
) s
ORDER BY index ASC;

此查询按我的意图运行。但我想知道是否有更好/更聪明的方法来做到这一点。所以这个问题主要是出于重写这个工作查询的兴趣,从替代方法中学习。

我正在使用PostgreSQL 10.1。

1 个答案:

答案 0 :(得分:1)

您可以使用CTE代替嵌套查询,这可能(或可能不)更容易阅读:

WITH two_below_four AS (
    SELECT index, name
    FROM my_table
    WHERE index < 4
    ORDER BY index DESC
    LIMIT 2
)
SELECT * FROM two_below_four ORDER BY index;

此外,您可以从外部ORDER BY中省略ASC,因为升序是默认值。

请注意,对于发布的数据,以下查询也有效:

SELECT * FROM my_table WHERE index IN (4-2,4-1) ORDER BY index; 

SELECT * FROM my_table WHERE index >= 4-2 and index < 4 ORDER BY index; 

SELECT * FROM my_table WHERE index BETWEEN 4-2 and 4-1 ORDER BY index; 

SELECT * FROM my_table WHERE index >= 4-2 ORDER BY index LIMIT 2;

当然,只有在没有“差距”的情况下,这些工作才会起作用。在索引中。