sql - 根据日期获取价值
问题描述
我试图根据未来的定价来获得产品的价格点。由于价格点不同,我不能真正做到 Max(到期日期)。而且我也不能做 Max(Price),因为高价可能是过期的,也可能是新的。我的数据看起来像这样:
供应商 | 产品 | 价格 | 生效日期 | 截止日期 |
---|---|---|---|---|
供应商 1 | 一个 | 800 | 04-01-2121 | 2023 年 12 月 31 日 |
供应商 1 | 一个 | 1000 | 01-01-2121 | 03-31-2023 |
供应商 1 | 乙 | 500 | 04-01-2121 | 2023 年 12 月 31 日 |
供应商 1 | 乙 | 400 | 01-01-2121 | 03-31-2023 |
供应商 2 | D | 200 | 01-01-2121 | 2023 年 12 月 31 日 |
供应商 2 | C | 600 | 01-01-2121 | 2023 年 12 月 31 日 |
我试图得到的结果如下:
供应商 | 产品 | 价格 | 生效日期 | 截止日期 |
---|---|---|---|---|
供应商 1 | 一个 | 800 | 04-01-2121 | 2023 年 12 月 31 日 |
供应商 1 | 乙 | 500 | 04-01-2121 | 2023 年 12 月 31 日 |
供应商 2 | D | 200 | 01-01-2121 | 2023 年 12 月 31 日 |
供应商 2 | C | 600 | 01-01-2121 | 2023 年 12 月 31 日 |
有任何想法吗?
解决方案
要获得expirationdate
最大的产品信息,我们可以按产品的降序对行进行分组,expirationdate
并找到每个产品的序列号最低的行,或者我们可以简单地使用子查询来选择产品组中 where expirationdate
=的信息。max(expirationdate)
第一种方法会更有效。但是,如果您的 dbms 不支持 row_number() 那么您可以使用第二种方法。
架构:
create table mydata(Supplier varchar(30),Product varchar(30), Price int,EffectiveDate date, ExpirationDate date); insert into mydata values('Supplier 1', 'A', 800 ,'04-01-2121', '12-31-2023'); insert into mydata values('Supplier 1', 'A', 1000 ,'01-01-2121', '03-31-2023'); insert into mydata values('Supplier 1', 'B', 500 ,'04-01-2121', '12-31-2023'); insert into mydata values('Supplier 1', 'B', 400 ,'01-01-2121', '03-31-2023'); insert into mydata values('Supplier 2', 'D', 200 ,'01-01-2121', '12-31-2023'); insert into mydata values('Supplier 2', 'C', 600 ,'01-01-2121', '12-31-2023');
查询#1
WITH cte AS (SELECT supplier, product, price, effectivedate, expirationdate, ROW_NUMBER () OVER (PARTITION BY product ORDER BY expirationdate DESC) rn FROM mydata) SELECT supplier, product, price, effectivedate, expirationdate FROM cte WHERE rn = 1
输出:
供应商 产品 价格 生效日期 截止日期 供应商 1 一个 800 2121-04-01 2023-12-31 供应商 1 乙 500 2121-04-01 2023-12-31 供应商 2 C 600 2121-01-01 2023-12-31 供应商 2 D 200 2121-01-01 2023-12-31
旧版本 DBMS 的查询#2:
SELECT supplier, product, price, effectivedate, expirationdate FROM mydata m where effectivedate = (select max(effectivedate) from mydata md where m.product=md.product)
输出:
供应商 产品 价格 生效日期 截止日期 供应商 2 D 200 2121-01-01 2023-12-31 供应商 2 C 600 2121-01-01 2023-12-31 供应商 1 乙 500 2121-04-01 2023-12-31 供应商 1 一个 800 2121-04-01 2023-12-31
db<>在这里摆弄
推荐阅读
- python - 私下更新字典?
- c++ - 如何从函数返回单个 boost::range 或两个连接的 boost::ranges
- image - 如何在使用 CIFAR-10 训练的模型中测试我的新图像?(使用 tensorflow)
- javascript - 在 Kubuntu 18.04 上运行在 Nodejs 中设置环境变量的 NPM 模块时权限被拒绝
- python-3.x - 在 jupyter notebook 的数据框中使用下拉列表
- prolog - 检查序言回文123123
- c++ - 使用 setw 和 setfill 输出格式
- python - 如何使用任何 Windows 程序(例如 Python)将多个文件中的前 n 行删除到单个输出文件中
- xamarin - Visual Studio,Xamarin,我重命名了其中一个项目,现在搞砸了
- php - 如何根据取货日期和退货日期进行搜索?