给出以下数据表:
ID NAME DATE_FROM DATE_TO PRICE
1 AAA 09.10.2018 16:00 10.10.2018 16:00 4
2 AAA 10.10.2018 16:00 11.10.2018 16:00 5
3 BBB 10.10.2018 16:00 11.10.2018 16:00 6
4 CCC 09.10.2018 16:00 01.01.2019 00:00 7
5 AAA 11.10.2018 16:00 01.01.2019 00:00 7
6 BBB 11.10.2018 16:00 01.01.2019 00:00 5
每个项目(AAA,BBB,CCC)的价格在两个给定日期之间有效。价格更改(如果有)将始终在下午4点开始和结束。我可以通过以下方式获得当前价格:
SELECT *
FROM Items
WHERE DATE_FROM < '11.10.2018 16:00' and DATE_TO >= '11.10.2018 16:00';
和在下午4点后有效的价格
SELECT *
FROM Items
WHERE DATE_FROM <= '11.10.2018 16:00' and DATE_TO > '11.10.2018 16:00';
下午4点以后,我只需要有效价格,但与当前价格相比,我必须区分涨价和跌价。现在我正在用Java执行此操作(获取当前价格和未来价格将它们存储在两个列表中 并进行比较)。是否可以获取所有在下午4点之后具有有效价格的行,但仅当价格随着某些子选择而增加时才行?
SELECT *
FROM Items
WHERE DATE_FROM <= '11.10.2018 16:00' and DATE_TO > '11.10.2018 16:00'
and price >(select somehow current price???);
仅获取
5 AAA 11.10.2018 16:00 01.01.2019:00 7
因为BBB的价格下降且CCC不变。
答案 0 :(得分:1)
您可以尝试在同一张表上使用两次选择,然后查看结果。
与此类似的东西(未经测试!):
select * from items t1, items t2
WHERE t1.DATE_FROM < '11.10.2018 16:00' and t1.DATE_TO >= '11.10.2018 16:00'
and t2.DATE_FROM <= '11.10.2018 16:00' and t2.DATE_TO > '11.10.2018 16:00'
and t1.id = t2.id and t1.price < t2.price;
答案 1 :(得分:1)
这可能是您想要的:
SELECT *
FROM Items
WHERE DATE_FROM <= '11.10.2018 16:00' and DATE_TO > '11.10.2018 16:00'
and items.id NOT IN (select id FROM Items WHERE price > Items.price AND name = Items.name);
!未经测试
答案 2 :(得分:1)
您可能应该对表Itens
进行左连接。
SELECT price.id, price.name, price.date_from, price.date_to, price.price,
price_before.price price_before
FROM Items price left join Items price_before on (
price.name = price_before.name and price.DATE_FROM = price_before.DATE_TO
)
WHERE price.DATE_FROM = <x> and price.DATE_TO = <y>
;
通过这种方式,您可以将顺序排列的两行连接在一起,并且所有行都具有价格(价格和该价格之前的价格)。
然后,如果价格更高或更低,则将易于比较。如果您只希望增加价格,则可以在where子句price.price > price_before.price
我无法测试此代码,因为我现在没有数据库。所以这可能是越野车。
答案 3 :(得分:1)
使用功能lag()
查找每种产品的先前价格。然后仅显示价格上涨的这些行。
select *
from (
select items.*, lag(price) over (partition by name order by date_from) prev_price
from items )
where date_from <= to_date('2018-10-11 16:00', 'yyyy-mm-dd hh24:mi')
and to_date('2018-10-11 16:00', 'yyyy-mm-dd hh24:mi') < date_to
and prev_price < price