簡體   English   中英

SQL比較列值

[英]SQL Compare column values

給定以下數據表:

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

您可以嘗試在同一張表上使用兩次選擇,然后看看結果如何。

與此類似的東西(未經測試!):

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;

這可能是您要尋找的:

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); 

!未測試

您可能應該對表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

我無法測試此代碼,因為我現在沒有數據庫。 因此,這可能是越野車。

使用函數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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM