获取时间可持续从表中的SQL Server

问题描述:

增加销售记录,我有2个表获取时间可持续从表中的SQL Server

Product 
    ProdId, ProdName 
    1  A 
    2  B 

Sale 
SaleId, ProdId, Sale, Year 
1,  1,  100, 2012 
2,  1,  130, 2013 
3,  2,  100, 2012, 
4,  1,  150, 2014, 
5,  1,  180, 2015 
6,  2,  120, 2013, 
7,  2,  90, 2014, 
8,  2,  130, 2015 

我想要的产品,其销售的时间可持续增长的名称。 同类产品“A”有像2012年的销售记录 - 100个单位,2013年 - 130个单位,2014年 - 150个单位,2015年 - 180个单位,所以这个产品A的销售额持续增加。另一个非连续记录的情况是,产品“B”有2012年销售记录--100个单位,2013年 - 120个单位,2014年 - 90个单位,2015年 - 130个单位,因此对于产品“B”,它不是连续的。

我想要产品“A”的记录,谁持续增加销售。

帮助赞赏。

+0

查找每个产品的记录并循环查找每个产品的差异。如果差异总是正面的,你有你的产品。 –

+3

很糟糕的建议@VarunMehta – scsimon

+0

你想每年销售额的平均变化?或者只是为了展示每年都有积极变化的产品? – EMUEVIL

使用cross apply获取上一年的销售金额,并检查有条件的聚合条件。

select prodid 
from sale s1 
cross apply (select sale as prev_sale 
      from sale s2 
      where s1.prodid=s2.prodid and s2.year=s1.year-1) s2 
group by prodid 
having sum(case when sale-prev_sale<0 then 1 else 0 end) = 0 

要获得这样的产品编号的所有行,可使用

select * from sale 
where prodid in (select prodid 
       from sale s1 
       cross apply (select sale as prev_sale 
           from sale s2 
           where s1.prodid=s2.prodid and s2.year=s1.year-1) s2 
       group by prodid 
       having sum(case when sale-prev_sale<0 then 1 else 0 end) = 0 
       ) 

这里的CTE

declare @sale table (SaleID int, ProdId int, Sale int, Year int) 
insert into @sale 
values 
(1,1,100,2012), 
(2,1,130,2013), 
(3,2,100,2012), 
(4,1,150,2014), 
(5,1,180,2015), 
(6,2,120,2013), 
(7,2,90,2014), 
(8,2,130,2015) 

declare @product table (ProdID int, ProdName char(1)) 
insert into @product 
values 
(1,'A'), 
(2,'B') 

;with cte as(
select 
    row_number() over (partition by ProdId order by Year) as RN 
    ,* 
from @sale) 

select 
    p.ProdName 
    ,cte.* 
from cte 
inner join 
    @product p on 
    p.ProdID=cte.ProdId 
where cte.ProdId IN 
    (select distinct 
     c1.ProdId 
    from cte c1 
     left join 
     cte c2 on c2.RN = c1.rn+1 and c2.ProdId = c1.ProdId 
    group by c1.ProdId 
    having min(case when c1.Sale < isnull(c2.Sale,999999) then 1 else 0 end) = 1) 

返回方式

+----------+----+--------+--------+------+------+ 
| ProdName | RN | SaleID | ProdId | Sale | Year | 
+----------+----+--------+--------+------+------+ 
| A  | 1 |  1 |  1 | 100 | 2012 | 
| A  | 2 |  2 |  1 | 130 | 2013 | 
| A  | 3 |  4 |  1 | 150 | 2014 | 
| A  | 4 |  5 |  1 | 180 | 2015 | 
+----------+----+--------+--------+------+------+ 

你可以这样做使用row_number()两次:

select prod_id 
from (select s.*, 
      row_number() over (partition by s.prod_id order by sale) as seqnum_s, 
      row_number() over (partition by s.prod_id order by year) as seqnum_y 
     from sales s 
    ) s 
group by prod_id 
having sum(case when seqnum_s = seqnum_y then 1 else 0 end) = count(*); 

即按年份和销售额排序。当所有行号都相同时,销售额就会增加。

注:在某些情况下,销售额可能会增加。这可以通过逻辑来处理 - 通过排除或包含这种情况。我没有包括这方面的逻辑,因为你的问题不清楚在这种情况下该怎么做。

+1

最佳答案恕我直言。好主意 – scsimon