sql - 使用分层标准获取不同的值
问题描述
我试图弄清楚如何使用包含数千条记录的表格并根据一些标准对其进行提炼。但是,标准是分层的。最好用一个例子来解释:
产品密钥 | 产品代码 | 数量捆绑 | 产品组 | 产品到期 |
---|---|---|---|---|
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 | 小部件 | 无效的 |
任何的意见都将会有帮助!
谢谢!
解决方案
您可以使用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;
推荐阅读
- linux - 一个定期执行并且在收到信号时执行的函数可以是一个临界区吗?
- javascript - 如何检查浏览器是否支持 CSS 通用兄弟选择器~
- ruby-on-rails - 如何在 AJAX 请求中附加输入元素?
- azure - Azure CLI 命令在 azure 函数应用(门户)中不起作用
- ansible - Ansible 模棱两可的环境值
- hibernate - 如何使用spring data jpa按集合属性查找所有匹配项?
- android - 如何进行水平滑动直到在 webdriverio 中找到用于移动自动化的所需元素?
- excel - UserForm WebBrowser 网页抓取
- amazon-rds - Terraform 计划要销毁导入的 RDS 资源
- sql - COALESCE Vs OR 为空