【问题标题】:Get all rows with one of the top 2 values in a column获取列中具有前 2 个值之一的所有行
【发布时间】:2012-03-11 03:26:18
【问题描述】:

我有一个包含多个条目的表格,并且我已根据销售标准对其进行排序。所以,如果条目是这样的:

商品销售 一个 10 b 10 c 9 d 8 8 f 7

我想提取销售额最高和第二高的商品。像这样, 我想提取abc
PostgreSQL 中有什么函数可以帮助解决这个问题吗?

【问题讨论】:

    标签: sql postgresql window-functions


    【解决方案1】:

    要将所有行包含在前两个销售值之一中,您可以使用dense_rank() 窗口函数:

    WITH x AS (
       SELECT *
             ,dense_rank() OVER (ORDER BY sales DESC) AS rnk
       FROM   tbl
       )
    SELECT item, sales
    FROM   x
    WHERE  rnk < 3;
    

    为此,您需要 PostgreSQL 8.4 或更高版本。


    对于旧版本,您可以:

    SELECT *
    FROM   tbl
    JOIN   (
        SELECT sales
        FROM   tbl
        GROUP  BY 1
        ORDER  BY 1 DESC
        LIMIT  2
        ) t1 USING (sales)
    

    【讨论】:

      【解决方案2】:

      使用 ORDER BY 和 LIMIT:

        SELECT Item, Sales
          FROM mytable 
      ORDER BY Sales DESC 
         LIMIT 2;
      

      结果:

      商品销售 ---- ----- 一个 10 b 9

      SQL Fiddle

      【讨论】:

      • 只是好奇......为什么(在地球上)你正确对齐每行的第一个术语?
      • 但这不会处理重复项吗?例如,如果我有一个 10 b 10 c 9 d 8 那么你会想要 a,b 和 c 但这不只给你 a 和 b 吗?
      • 感谢您的评论,@Bohemian。我不做那个IRL。不过,出于示例的目的,似乎更容易阅读。显然不是每个人,虽然:D
      • @AnuragChaudhury:如果有重复,你只会得到两行 LIMIT 2: sqlfiddle.com/#!1/3d58a/1
      • @AnuragChaudhury:我完全没有从你的问题中得到答案。您可以考虑更新问题以更好地说明这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多