假设我有一个包含两列的表:
| 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'
答案 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
答案 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;