SQL比较列值

时间:2018-10-11 12:40:03

标签: sql oracle

给出以下数据表:

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不变。

4 个答案:

答案 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()查找每种产品的先前价格。然后仅显示价格上涨的这些行。

demo

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
相关问题