【问题标题】:SQL window function replace max by correspondent stringSQL窗口函数用对应的字符串替换最大值
【发布时间】:2017-05-26 20:25:04
【问题描述】:

我有一个名为products的表:

+---+------------+----------------+--------------- + | ID|产品名称|产品类别|产品收入| +---+------------+----------------+--------------- + | 1|橙色|水果| 170000| | 2|苹果|水果| 300000| | 3|桃子|水果| 98000| | 4|香蕉|水果| 285000| | 5|黄瓜|蔬菜| 451000| | 6|番茄|蔬菜| 512000| | 7|沙拉|蔬菜| 281000| | 8|白菜|蔬菜| 85000| | 9|可乐|饮料| 687000| | 10|芬达|饮料| 258000| | 11|精灵|饮料| 432000| | 12|百事可乐|饮料| 661000| +---+------------+----------------+--------------- +

我执行这个 SQL 查询:

SELECT *, max(product_revenue) OVER w AS max  
FROM products 
WINDOW w AS (PARTITION BY product_category) 
ORDER BY Id

因此,在每个 product_category 中使用新的 ma​​x 列来表示最大 product_revenue 的表格:

+---+------------+----------------+--------------- +------+ | ID|产品名称|产品类别|产品收入|最大值| +---+------------+----------------+--------------- +------+ | 1|橙色|水果| 170000|300000| | 2|苹果|水果| 300000|300000| | 3|桃子|水果| 98000|300000| | 4|香蕉|水果| 285000|300000| | 5|黄瓜|蔬菜| 451000|512000| | 6|番茄|蔬菜| 512000|512000| | 7|沙拉|蔬菜| 281000|512000| | 8|白菜|蔬菜| 85000|512000| | 9|可乐|饮料| 687000|687000| | 10|芬达|饮料| 258000|687000| | 11|精灵|饮料| 432000|687000| | 12|百事可乐|饮料| 661000|687000| +---+------------+----------------+--------------- +------+

问题是我怎样才能得到对应的产品名称而不是数字? 所以我想得到这个:

+---+------------+----------------+--------------- +----------+ | ID|产品名称|产品类别|产品收入|最大 | +---+------------+----------------+--------------- +----------+ | 1|橙色|水果| 170000|苹果| | 2|苹果|水果| 300000|苹果| | 3|桃子|水果| 98000|苹果| | 4|香蕉|水果| 285000|苹果| | 5|黄瓜|蔬菜| 451000|番茄| | 6|番茄|蔬菜| 512000|番茄| | 7|沙拉|蔬菜| 281000|番茄| | 8|白菜|蔬菜| 85000|番茄| | 9|可乐|饮料| 687000|可乐| | 10|芬达|饮料| 258000|焦炭| | 11|精灵|饮料| 432000|焦炭| | 12|百事可乐|饮料| 661000|焦炭| +---+------------+----------------+--------------- +----------+

【问题讨论】:

  • 您的 DBMS 是否支持 FIRST_VALUE?试试FIRST_VALUE(product_name) OVER (PARTITION BY product_category ORDER BY product_revenue DESC)
  • “vegetable”和“drink”不是您数据中的产品名称。
  • 谢谢,@GordonLinoff!我的,错误,我已经更正了 max 列。

标签: sql aggregate partitioning


【解决方案1】:

您可以分两步完成:

SELECT p.*,
       MAX(CASE WHEN maxpr = product_revenue THEN product_name END) OVER (PARTITION BY product_category)
FROM (SELECT p.*, max(product_revenue) OVER w AS maxpr
      FROM products p WINDOW w AS (PARTITION BY product_category)
     ) p
ORDER BY Id;

还有其他方法,具体取决于您的数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2019-06-30
    • 2021-10-13
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多