【问题标题】:get the incremental pattern获取增量模式
【发布时间】:2019-02-16 14:35:10
【问题描述】:

我有如下表格

  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 但我无法获得所需的输出

【问题讨论】:

  • 是否允许价格在一年内相同,例如2009=10,2010=10,2011=15?
  • 这个不清楚。 “仅获取价格逐年递增的项目名称”并不是告诉人们该表将为该输入输出。 (虽然我怀疑我们可以猜到你的意思。)请使用足够的单词和句子来清楚,不要试图把所有东西都塞进一个短语或句子中。准确定义“增量顺序”。什么是CK? (PKs & UNIQUE NOT NULL)可以有空值吗?还有其他限制吗?请阅读minimal reproducible example 并采取行动。展示你能做的部分。
  • 这些答案之一是否解决了您的问题?如果是这样,请将答案标记为已接受(向上/向下投票箭头下方的绿色箭头)。否则,您能否提供更多信息以帮助解决问题。见stackoverflow.com/help/someone-answers

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


【解决方案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

【讨论】:

    【解决方案2】:

    你可以使用lag解析函数,如下select语句:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 2015-01-18
      • 2019-07-22
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      相关资源
      最近更新 更多