我有一张表格,其中包含产品价格的历史数据,该数据每分钟都会波动。
这是一天的快照:
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)
但这并不能给我所有连续出现的情况。 有人可以帮忙吗?
答案 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)