首页 > 解决方案 > 提取最新的非零收入行

问题描述

样本数据:

输入 :

product_name| snapshot_time (varchar)|  revenue  (varchar)  |
product_A   | 2021-07-01            |    $0.0              |
product_A   | 2021-04-01            |    $30.12            |
product_A   | 2021-06-01            |    $12.23            |
product_B   |  ......               | ......               |
product_C   | ......                | .......              |
  ......

输出应该是:

product_name| snapshot_time (varchar)|  revenue  (varchar)   |
product_A   | 2021-06-01             |    $12.23             |
product_B   |  lastest   time        | non zero value        |
product_C   | lastest   time         |non zero value         |
  ......

要求是:

对于每个产品:

提取最新的非零收入

提取最新的$0.0收入


我试过:

with t as (
select *, row_number() over(partition by product_name order by snapshot_time desc, revenue desc) as rnk 
from sample_data) 
SELECT product_name, snapshot_time, revenue
FROM t where rnk = 1;

但这是错误的,因为它可能会提取该$0.0行。

标签: mysqlsqlmysql-8.0

解决方案


考虑这个版本:

WITH t AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY product_name
                                 ORDER BY revenue > 0 DESC, snapshot_time DESC) rn
    FROM sample_data
)

SELECT product_name, snapshot_time, revenue
FROM t
WHERE rn = 1;

推荐阅读