【问题标题】:n-th row in PostgreSQL for p-quantilePostgreSQL 中的第 n 行用于 p 分位数
【发布时间】:2012-09-25 11:37:38
【问题描述】:

我正在尝试获取查询结果的第 n 行。其他帖子建议使用OFFSETLIMIT,但禁止使用变量(ERROR: argument of OFFSET must not contain variables)。此外,我阅读了游标的用法,但即使在阅读了他们的 PostgreSQL 手册页之后,我也不太确定如何使用它们。还有其他关于如何使用游标的建议或示例吗?

我的主要目标是计算一行的 p 分位数,由于 PostgreSQL 默认不提供此功能,我必须自己编写。

干杯

【问题讨论】:

  • 您使用的是哪个 PostgreSQL 版本?因为我很确定您可以在 OFFSET 子句中使用“变量” - 至少在最新版本中。
  • 你看到了吗:pgxn.org/dist/quantile
  • 嘿伙计,我使用的是 PostgreSQL 8.4。是的,我看到了,但我无法安装分位数扩展。它还使用我尽量避免的外部 c 代码
  • 这些也可以帮助您入门:wiki.postgresql.org/wiki/Aggregate_Median
  • 是的,在发布之前我已经发现了,但再次感谢您的努力

标签: postgresql cursor limit offset quantile


【解决方案1】:

以下返回结果集的第 5 行:

select *
from (
   select <column_list>,
          row_number() over (order by some_sort_column) as rn
) t
where rn = 5;

必须包含order by,否则“第 5 行”的概念没有意义。

您提到“使用变量”,所以我不确定您实际上想要达到什么目的。但是您应该能够提供值 5 作为此查询(甚至是子选择)的变量。

您可能还想进一步研究窗口函数。因为有了它,你可以例如对当前行(或类似结构)之前的 3 行执行 sum() - 这也可能对您有用。

【讨论】:

    【解决方案2】:

    如果您想获得第 10 条记录,下面的查询也可以正常工作。

     select * from table_name order by sort_column limit 1 offset 9
    

    OFFSET 只是在开始返回行之前跳过那么多行,如 LIMIT 子句中所述。

    【讨论】:

    • 查询是否会按照您的喜好返回行。
    • 不,因为我不能在 LIMIT 或 OFFSET 中使用聚合函数
    猜你喜欢
    • 2012-12-28
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2014-03-26
    • 2018-11-04
    • 2011-03-05
    • 2012-10-16
    相关资源
    最近更新 更多