首页 > 解决方案 > 使用分层标准获取不同的值

问题描述

我试图弄清楚如何使用包含数千条记录的表格并根据一些标准对其进行提炼。但是,标准是分层的。最好用一个例子来解释:

产品密钥 产品代码 数量捆绑 产品组 产品到期
1 000ABC 1 小部件 无效的
2 000ABC 5 小部件 无效的
3 000ABC 1 小部件 无效的
4 000ABC 10 小部件 无效的
5 000DEF 1 小部件 无效的
6 000DEF 10 小部件 2021 年 1 月 15 日
7 000DEF 10 小部件 无效的
8 000HIJ 5 小部件 2020 年 11 月 20 日
9 000HIJ 10 小部件 无效的
10 000HIJ 5 小部件 无效的

使用上面的示例数据,我最终想要的是一个列表,对于每个产品代码,我们只返回一个产品密钥。标准是:如果产品代码的数量捆绑值 = 1,则使用该产品密钥,如果产品代码有多个数量捆绑 = 1,并且这两个产品密钥都未过期,则使用最小产品密钥,如果产品代码没有 Qty Bundle = 1,只需取未过期的最小产品密钥即可。

基于这些标准,脚本的结果应该产生:

产品密钥 产品代码 数量捆绑 产品组 产品到期
1 000ABC 1 小部件 无效的
5 000DEF 1 小部件 无效的
9 000HIJ 10 小部件 无效的

任何的意见都将会有帮助!

谢谢!

标签: sqlselectdatatablesdistinctcriteria

解决方案


您可以使用row_number()适当的订购标准:

select t.*
from (select t.*,
             row_number() over (partition by productcode
                                order by (case when qty_bundle = 1 and expiry is null then 1
                                               else 2
                                          end),
                                         (case when expiry is not null then 1 else 2
                                               else 3
                                          end),
                                         productkey
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

推荐阅读