【问题标题】:DB2 - row_number function - Need first partition row in outputDB2 - row_number 函数 - 需要输出中的第一个分区行
【发布时间】:2024-01-24 00:02:01
【问题描述】:

我在 SQL 下尝试过,但它不起作用。

问题:它没有给出第一个分区行。

我正在添加表详细信息和 SQL。这是针对 DB2 数据库的。

Books Table:  
book_id  
rating 
title 
isbn 
publisher_id


WITH cte_books AS (
    SELECT
        publisher_id,
        ROW_NUMBER() OVER (
            PARTITION BY publisher_id 
            ORDER BY rating DESC
        ) row_num,
        book_id, 
        rating,
        title
    FROM 
        books
    WHERE 
        publisher_id IS NOT NULL
)
SELECT 
  * 
FROM 
    cte_books
WHERE 
    row_num >= 1 AND 
    row_num >= 2;

【问题讨论】:

    标签: db2 row-number


    【解决方案1】:

    ROW_NUMBER() 更改为COUNT(1),删除ORDER BY 并使用WHERE row_num > 1

    【讨论】:

      【解决方案2】:
      WHERE 
          row_num >= 1 AND 
          row_num >= 2;
      

      实际上是row_num >= 2

       WHERE 
               row_num = 1
      

      将返回第一行

      编辑: 如果您想为超过 1 行的人提供所有行 - 这是这样做的方法:

      WITH cte_books AS (
          SELECT
              publisher_id,
              ROW_NUMBER() OVER (
                  PARTITION BY publisher_id 
                  ORDER BY rating DESC
              ) row_num,
              book_id, 
              rating,
              title
          FROM 
              books
          WHERE 
              publisher_id IS NOT NULL
      )
      
      SELECT * 
        FROM cte_books t 
       WHERE exists (SELECT 1 
                       FROM cte_books 
                      WHERE row_num > 1 
                        AND pubisher_id = t.publisher_id)
      

      【讨论】:

      • 嗨,迈克,我需要至少有 2 个分区的 publisher_id 记录的输出。 row_num = 1 对我不起作用。
      • 好的,感谢您的澄清 - 我已经编辑了我的答案 - 检查一下
      • 是否可以修改此 SQL 以提供 row_num = 1 的输出也将显示至少有两个分区的记录?
      • 我已将 CTE 添加到我的答案中 - 我不明白您的评论 - 它会显示拥有多个出版商的人的所有记录
      • 谢谢迈克!这正是我想要的。欣赏!
      最近更新 更多