SQL查询以查找价格连续上涨的产品

时间:2019-02-28 11:47:22

标签: sql sql-server

我有一张表格,其中包含产品价格的历史数据,该数据每分钟都会波动。

这是一天的快照:

ProductName | Iteration | Price | Date
----------------------------------------------
A           |    1      | 10    | 1st Feb 2019 12:01 AM
B           |    1      | 10    | 1st Feb 2019 12:01 AM
C           |    1      | 10    | 1st Feb 2019 12:01 AM
A           |    2      | 12    | 1st Feb 2019 12:02 AM
B           |    2      | 9     | 1st Feb 2019 12:02 AM
C           |    2      | 15    | 1st Feb 2019 12:02 AM
A           |    3      | 15    | 1st Feb 2019 12:03 AM
B           |    3      | 9     | 1st Feb 2019 12:03 AM
C           |    3      | 14    | 1st Feb 2019 12:03 AM
A           |    4      | 14    | 1st Feb 2019 12:04 AM
B           |    4      | 11    | 1st Feb 2019 12:04 AM
C           |    4      | 14    | 1st Feb 2019 12:04 AM

我想找出产品名称(每天),该名称显示出其价格在连续迭代中连续上涨以及出现的次数。

在上面给定的样本数据中,产品A的价格连续上升。 我想要如下输出:

ProductName | Occurrence
------------------------
A           | 3

我尝试过如下所示的自我加入:

SELECT A.ProductName, A.Iteration as LastIteration, B.Iteration  as CurrentIteration, A.Price as LastPrice, B.Price as CurrentPrice FROM
ProductDetails (NOLOCK) A
INNER JOIN ProductDetails (NOLOCK) B ON A.ProductName = B.ProductName AND B.Iteration=A.Iteration+1 AND B.Price>A.Price AND Convert(Date, A.Date)=Convert(Date, B.Date)

但这并不能给我所有连续出现的情况。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您可以为此使用窗口功能。找到价格上涨的边界。然后使用它来定义组-并汇总以找到组的长度。

以下获取价格上涨期间的所有持续时间:

select productname, count(*) as num_prices,
       min(price) as first_price, max(price) as last_price
from (select t.*,
             sum(case when prev_price < price then 0 else 1 end) over (partition by productname order by iteration) as grp
      from (select t.*,
                   lag(price) over (partition by productname order by iteration) as prev_price
            from t
           ) t
     ) t
group by productname, grp
having count(*) > 1;

如果要最大,可以添加:

select top (1) with ties . . .
. . .
order by row_number() over (partition by productname order by count(*) desc)
相关问题