代码之家  ›  专栏  ›  技术社区  ›  Steerpike

Postgres:在结果集中查找特定行的位置?

  •  15
  • Steerpike  · 技术社区  · 16 年前

    我试图找出如何获取查询中单个项相对于查询返回的所有项的相对位置。

    例如,得到答案的方法是:

    single_item = SELECT * FROM table WHERE id=65
    result = SELECT * FROM table WHERE published_date < date_value
    x=1
    foreach(result as item):
        if(item.id == single_item.id):
            required_value = x
        endif
        x++
    endforeach
    

    有没有一个简单的方法 required_value 仅仅通过一个postgres查询?

    1 回复  |  直到 16 年前
        1
  •  28
  •   OMG Ponies    16 年前

    使用 analytic/ranking/windowing functionality - 8.4 documentation link

    WITH summary AS (
       SELECT t.*,
              ROW_NUMBER() OVER(ORDER BY t.published_date) AS position
         FROM TABLE t)
    SELECT s.*
      FROM summary s
     WHERE s.id = 65
    

    交替进行 WITH 语法:

    SELECT s.*
      FROM (SELECT t.*,
                   ROW_NUMBER() OVER(ORDER BY t.published_date) AS position
              FROM TABLE t) s
     WHERE s.id = 65
    

    这个 position 列将是一个整数值,表示 id 值是65,基于 published_date 按升序排列。如果要在存在关联时复制位置值,请替换 ROW_NUMBER() 具有 RANK()