- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
感谢所有花时间发表评论和回答的人。
-
我有一个这样的价格历史表(伪代码):
table price_history (
product_id,
price,
changed_date
)
其中存储了一些产品的历史价格:
1, 1.0, '2017-12-18'
1, 1.2, '2017-12-20'
1, 0.9, '2018-04-20'
1, 1.1, '2018-07-20'
1, 1.3, '2018-07-22'
2, 10.0, '2017-12-15'
2, 11.0, '2017-12-16'
2, 9.9, '2018-01-02'
2, 10.3, '2018-04-04
现在我想要一些产品在一定时期内的价格。例如。从 2018-01-01 到现在。
简单的方法:
SELECT * FROM price_history
WHERE product_id in (1,2) AND changed_date >= 2018-01-01
不行,因为从 2018-01-01 到第一次价格变动的每个产品的单独价格不包括在内:
1, 0.9, '2018-04-20'
1, 1.1, '2018-07-20'
1, 1.3, '2018-07-22'
2, 9.9, '2018-01-02'
2, 10.3, '2018-04-04
但了解期初的价格至关重要。
所以,除了期间内的价格变化外,还必须包括之前的最后一次变化。结果应该是这样的:
1, 1.2, '2017-12-20'
1, 0.9, '2018-04-20'
1, 1.1, '2018-07-20'
1, 1.3, '2018-07-22'
2, 11.0, '2017-12-16'
2, 9.9, '2018-01-02'
2, 10.3, '2018-04-04
问:如何指定这样的select语句?
编辑:
Ajay Gupta 的测试场景和解决方案
CREATE TABLE price_history (
product_id integer,
price float,
changed_date timestamp
);
INSERT INTO price_history (product_id,price,changed_date) VALUES
(1, 1.0, '2017-12-18'),
(1, 1.2, '2017-12-20'),
(1, 0.9, '2018-04-20'),
(1, 1.1, '2018-07-20'),
(1, 1.3, '2018-07-22'),
(2, 10.0, '2017-12-15'),
(2, 11.0, '2017-12-16'),
(2, 9.9, '2018-01-02'),
(2, 10.3, '2018-04-04');
获奖选择:
with cte1 as
(Select *, lag(changed_date,1,'01-01-1900')
over(partition by product_id order by changed_date)
as FromDate from price_history),
cte2 as (Select product_id, max(FromDate)
as changed_date from cte1
where '2018-01-01'
between FromDate and changed_date group by product_id)
Select p.* from price_history p
join cte2 c on p.product_id = c.product_id
where p.changed_date >= c.changed_date
order by product_id,changed_date;
结果:
product_id | price | changed_date
------------+-------+---------------------
1 | 1.2 | 2017-12-20 00:00:00
1 | 0.9 | 2018-04-20 00:00:00
1 | 1.1 | 2018-07-20 00:00:00
1 | 1.3 | 2018-07-22 00:00:00
2 | 11 | 2017-12-16 00:00:00
2 | 9.9 | 2018-01-02 00:00:00
2 | 10.3 | 2018-04-04 00:00:00
我必须承认,这远远超出了我有限的 (PG-)SQL 技能。
最佳答案
使用 Lag
和 cte
with cte1 as (
Select *,
lag(changed_date,1,'01-01-1900') over(partition by product_id order by changed_date) as FromDate
from price_history
), cte2 as (
Select product_id, max(FromDate) as changed_date
from cte1
where '2018-01-01' between FromDate and changed_date
group by product_id
)
Select p.*
from price_history p
join cte2 c on p.product_id = c.product_id
where p.changed_date >= c.changed_date;
关于sql - 选择期间内加上期间之前的最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51321174/
我已经搜索了对此的一种解释,但没有找到一种解释。在Prolog谓词的描述中,有时在变量名之前的问号,加号和减号是什么意思? 例: predicate(?Variable1,+Variable2,-Va
我正在尝试使用以下脚本 $(document).ready(function() { $('#item1_number_1').keyup(function() {
在下面的代码片段中考虑用注释的等价物替换第 8 行 1. private static String ipToText(byte[] ip) { 2. StringBuffer result = n
对于要在图表中显色的级别数要多的因子,我想用“其他”替换不在“前10名”中的任何级别。 替代问题:如何将因子水平降低到rcolorbrewer可以绘制为单独颜色的数量? 例如,如果我想从棒球数据中绘制
我想要一个通过 ssh 进入机器的命令,运行一个命令(cd 或执行脚本或 su),然后给我 shell。向 ssh 传递命令似乎总是退出。 我正在寻找的一些例子: 'ssh me@machine1 "
我正在尝试将引导工具提示附加到特定的全日历日 View td 元素。我可以从该元素上的 FC 单击事件获取 td 元素。如果我执行 console.dir(thing); 那么该元素将作为一个对象返回
我有一个脚本,应该循环遍历一系列 csv 文件以创建不同的有向图。当使用 matplotlib (plt.savefig()) 保存时,随着循环的进行,图表似乎会被保存在另一个图表之上。如果我使用 p
每当我输入数据库时,我都会使用strip_tags函数,每当我输出信息时,我都会使用htmlspecialchars。也就是说,如果我向数据库中引入类似的内容: Hello, Mr. John.
我想在我的网站上实现触摸屏自动滚动。示例可以在 Ubuntu 和 Windows 8 的界面中看到。 Ubuntu: window 8: 如果您快速向下滚动页面,松手后它会继续滚动并逐渐变慢。如果滚动
我正在尝试了解 Java 中的并发性。我知道同步,它在对象上创建一个监视器,之后另一个线程无法对该对象进行操作。 Volatile - 与处理器缓存有关,如果我使用它,所有线程都不会创建对象的副本。所
我最近将我的应用程序从使用自定义 SplashScreen(它只是一个带有计时器的表单加载主表单并自行关闭)更改为应用程序框架。 这是我所做的: 创建了一个新的 SplashScreenForm,用于
我想通过使用Sqoop作为Parquet文件将数据从Oracle导入到Hive。 我一直在尝试使用sqoop使用以下命令导入数据: sqoop import --as-parquetfile --co
我有一些使用 SpringJUnit4ClassRunner 运行的测试。我也刚刚迁移到 Log4j2,现在加载 log4j2.xml 配置文件时遇到问题,我总是收到此错误: ERROR Status
在正则表达式方面不是很好,但为什么在找到匹配项时 console.log 会触发两次? $('#name').keyup(function() { var regex = /[\€]/g;
我已经了解了 Spring Integration 4.2.0.RELEASE 中的新功能,用于通过 @EnableIntegrationManagement 注释和 捕获 channel 和处理程序
因此,我正在尝试将 vector 与智能指针一起使用,以便更轻松地进行内存管理,而且...好吧,我遇到了问题。这是我的代码的(大大缩短的)版本: bulletManager.h: class Bull
我正在制作游戏,我希望敌人绕圈移动,但敌人也应该不断向左移动。我尝试使用 CGPath 创建一个圆形路径并使其遵循该路径,然后添加一个不断向左移动的 SKAction。但节点似乎只是沿着 CGPath
我想写一个函数tokenize这需要 char s 来自迭代器。像这样: fn tokenize>(file: F) 如果我想使用 &str有了这个功能,我可以这样做: tokenize("foo".
我不确定我的理解是否正确 int i = 5; float f = 3.9; int result = i + f; 那么当int和float相加时,8.9就变成了8?这是否意味着
我想对相册进行更新突变,但在获取更新和返回值时遇到问题。 架构 Mongoose : var AlbumSchema = new Schema({ name: String, date
我是一名优秀的程序员,十分优秀!