按一列排序,但用另一列抵消

时间:2019-04-18 16:16:17

标签: sql postgresql

假设我有一个包含两列的表:

|  ID  |  A  |

我想按A排序,然后在给定ID后获得10条记录。在Postgres中处理此问题的最佳方法是什么?

为澄清起见,我想按A排序,但按ID分页。因此,如果我有一个像这样的表:

1 | 'C'
2 | 'B'
3 | 'A'
4 | 'G'
5 | 'A'
6 | 'H'

因此,按A排序后,我想要id = 1之后的前三个值,所以:

1 | 'C'
4 | 'G'
6 | 'H'

4 个答案:

答案 0 :(得分:2)

我认为这可以做到:

SELECT *
FROM (SELECT * from MyTable where ID > givenId order by A) sub
LIMIT 10;

答案 1 :(得分:1)

您不希望使用A列,所以:

SELECT r.* 
FROM t 
WHERE t.id > ANY (SELET id FROM t t2 WHERE t2.col = 'A')
ORDER BY col
LIMIT 10;

请注意,这不会返回任何以A作为值的行。当比较值未首先排序时,它也可以工作。

答案 2 :(得分:1)

任何列的排序都完全取决于order by子句,并且只有在存在预定顺序时,术语“之前”或“之后”才会出现。因此,一旦按“ A”列对记录进行了排序,就不能保证ID将按1,4,6的顺序进行排序,除非您还指定了ID的排序。

所以,如果你

  

想要id = 1之后的前三个值

这意味着应该有一种方法来确定id值变为1的点,并考虑所有超出的行。为确保您必须在order by中明确包含ID。 COUNT分析功能可以帮助我们标记点。

SELECT id,a
FROM ( SELECT t.*,COUNT(CASE WHEN id = 1 THEN 1 END) --the :id argument
         OVER( ORDER BY a,id) se 
       FROM t order by a,id --the rows are ordered first by a, then by id 
                            -- same as in the above count analytic function
     ) s
WHERE se = 1  limit 3; -- the argument 3 or 10 that you wish to pass
                       -- se = 1 won't change for other ids, it's a marker 
                       -- that id = n is reached

DEMO

答案 3 :(得分:0)

这将起作用:

SELECT * from Table1 where "ID"=1 
order by "A" desc limit 2; 

检查:http://sqlfiddle.com/#!15/5854b/3

用于查询:

SELECT * from Table1 where "ID"=1 
    order by "A" desc limit 10;