Значения столбца SQL Compare - PullRequest
       2

Значения столбца SQL Compare

0 голосов
/ 11 октября 2018

С учетом приведенной ниже таблицы данных:

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) имеет цену, действительную между двумя указанными датами.Изменения цены, если таковые имеются, всегда начинаются и заканчиваются в 16:00.Я могу получить текущие цены с:

SELECT * 
FROM Items 
WHERE DATE_FROM < '11.10.2018 16:00' and DATE_TO >= '11.10.2018 16:00';

и ценами, которые действительны после 16:00 с

SELECT * 
FROM Items 
WHERE DATE_FROM <= '11.10.2018 16:00' and DATE_TO > '11.10.2018 16:00'; 

Мне нужны только действительные цены после 4 часов, но я должен различать увеличенныеи снижение цен по сравнению с текущей ценой.На данный момент я делаю это в Java (получить текущие цены и будущие цены, сохранить их в двух списках и сделать сравнение).Можно ли получить все строки, которые имеют действительную цену после 16:00, но только если цена увеличивается с помощью некоторого подвыбора?

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 голосов
/ 11 октября 2018

Используйте функцию 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
0 голосов
/ 11 октября 2018

Это может быть то, что вы ищете:

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

! Не проверено

0 голосов
/ 11 октября 2018

Скорее всего, вам следует выполнить левое соединение с таблицей 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

. Я не смог бы протестировать этот код, потому что у меня сейчас нет базы данных.Так что это может быть ошибкой.

0 голосов
/ 11 октября 2018

Вы можете попробовать использовать двойной выбор на той же таблице и посмотреть, как это происходит.

Что-то вроде этого (не проверено!):

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...