получить пошаговый шаблон - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица, как показано ниже

  Item|Year|Price
   ---------------
  C|2010|50
  C|2000|40
  C|1999|30
  A|2010|10
  A|2009|15
  B|2018|10
  B|2017|100
  B|2015|750
  D|2018|220
  D|2017|200
  D|2016|185

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

ITEM
----
D
C

(D и C имеют только инкрементную цену для каждого более высокого года). Я пытался использовать self Join, но у меня не получается требуемый результат

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете использовать аналитическую функцию lag, как в следующем операторе выбора:

select item 
  from
 (
  select sign(price - lag(price,1,0) over (order by year)) val,
         t.item
    from tab t
 ) 
 group by item
 having avg(val)=1;

 ITEM
 ----
 D
 C

Демонстрация SQL Fiddle

0 голосов
/ 12 сентября 2018

Я думаю, что этот запрос даст вам результаты, которые вы хотите.Он использует самообъединение, чтобы найти все годы, когда цена товара ниже, чем в предыдущем году.Товары, которые не имеют более поздних лет, когда цена ниже (которая будет выглядеть как i2.Item = NULL), будут иметь COUNT (i2.Item) = 0:

SELECT i1.Item
FROM Items i1
LEFT JOIN Items i2 ON i2.Item = i1.Item AND i2.Price < i1.Price AND i2.Year > i1.Year
GROUP BY i1.Item
HAVING COUNT(i2.Item) = 0

Вывод:

Item
C
D

Демоверсия SQLFiddle

...