获取增量模式

时间:2018-09-12 03:06:50

标签: sql oracle plsql self-join ansi-sql

我的桌子如下

  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仅在更高的年份具有递增的价格) 我尝试使用自我加入,但无法获得所需的输出

2 个答案:

答案 0 :(得分:1)

我认为此查询将为您提供所需的结果。它使用自联接来查找某项价格低于上一年的所有年份。价格晚些时候没有价格降低的商品(将显示为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 Demo

答案 1 :(得分:1)

您可以像下面的select语句中那样使用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 Demo

相关问题