获取时间可持续从表中的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”的记录,谁持续增加销售。
帮助赞赏。
答
使用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
查找每个产品的记录并循环查找每个产品的差异。如果差异总是正面的,你有你的产品。 –
很糟糕的建议@VarunMehta – scsimon
你想每年销售额的平均变化?或者只是为了展示每年都有积极变化的产品? – EMUEVIL