postgresql - 使用窗函数进行限制和偏移

标签 postgresql where-clause window-functions offset sql-limit

我是否有可能使用窗口函数来使用 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 对每一行进行排名:

<表类=“s-表”> <标题> depname empno 工资 平均 博士 <正文> 开发 11 5200 5020 1 开发 7 4200 5020 1 人员 5 3500 3700 2 人员 2 3900 3700 2 销售 3 4800 4866.666666666667 3 销售 1 5000 4866.666666666667 3 销售 4 4800 4866.666666666667 3 技术 9 4500 5020 4 技术 8 6000 5020 4 技术 10 5200 5020 4

您可以使用该新列来应用所需的限制和偏移:

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/

相关文章:

django - FileField 无法与 Django 中的 ArrayField 一起使用

linux - 如果找到零行,psql 返回代码

c# - 林克/C# : Selecting and summing items from the result of a group by?

sql - PostgreSQL 窗口函数

postgresql - PostgreSQL 中的时间序列 - 列表更改

sql - 在 PostgreSQL 中使用 FROM 两个表时如何显示单个表的计数?

sql - PostgreSQL:LEFT JOIN 不返回整个左表

linq - 动态 Linq 帮助,不同的错误取决于作为参数传递的对象?

mysql - SQL如何执行limit和offset?

json - Postgres 获取 json 计数