我是否有可能使用窗口函数来使用 limit + offset 参数以获得页面结果?
即我想通过 depname 限制/偏移以仅显示 2 个部门,但显示该部门出现的所有行:
depname | empno | salary | avg
-------- |------ | ------ |----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
tech | 9 | 4500 | 5020.0000000000000000
tech | 8 | 6000 | 5020.0000000000000000
tech | 10 | 5200 | 5020.0000000000000000
我期望的结果是:
限制:2 - 偏移量:0
depname | empno | salary | avg
-------- |------ | ------ |----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
限制:2 - 偏移量:1
depname | empno | salary | avg
-------- |------ | ------ |----------------------
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
tech | 9 | 4500 | 5020.0000000000000000
tech | 8 | 6000 | 5020.0000000000000000
tech | 10 | 5200 | 5020.0000000000000000
我能用行号做的最好的事情就是这个
depname | empno | salary | avg |
-------- |------ | ------ |---------------------- |
develop | 11 | 5200 | 5020.0000000000000000 | 1
develop | 7 | 4200 | 5020.0000000000000000 | 2
personnel | 5 | 3500 | 3700.0000000000000000 | 1
personnel | 2 | 3900 | 3700.0000000000000000 | 2
sales | 3 | 4800 | 4866.6666666666666667 | 1
sales | 1 | 5000 | 4866.6666666666666667 | 2
sales | 4 | 4800 | 4866.6666666666666667 | 3
tech | 9 | 4500 | 5020.0000000000000000 | 1
tech | 8 | 6000 | 5020.0000000000000000 | 2
tech | 10 | 5200 | 5020.0000000000000000 | 3
所以我无法正确地限制和偏移...你知道如何使用窗口函数(或其他任何东西,但那些似乎很适合像这样分组)来根据一组值来限制和偏移到某个列值。
最佳答案
与 DENSE_RANK()
窗口函数:
SELECT *, DENSE_RANK() OVER (ORDER BY depname) dr
FROM tablename
您将获得一个新列 dr
按列 depname
对每一行进行排名:
您可以使用该新列来应用所需的限制和偏移:
WITH cte AS (
SELECT *, DENSE_RANK() OVER (ORDER BY depname) dr
FROM tablename
)
SELECT depname, empno, salary, avg
FROM cte
WHERE dr <= 2; -- limit : 2 - offset : 0
或者:
WITH cte AS (
SELECT *, DENSE_RANK() OVER (ORDER BY depname) dr
FROM tablename
)
SELECT depname, empno, salary, avg
FROM cte
WHERE dr > 1 AND dr <= 3; -- limit : 2 - offset : 1
请参阅demo .
关于postgresql - 使用窗函数进行限制和偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73111903/