在SQL

2017-04-07 27 views
0

推导动态列我有一个这样的表:在SQL

Store_Id | Week 
---------+-------- 
    A1 | 201601 
    A1 | 201602 
    A1 | 201604 
    A1 | 201606 
    A1 | 201607 
    A2 | 201552 
    A2 | 201603 
    A2 | 201604 
    A2 | 201605 
    A2 | 201608 

我需要派生旁边这个动态星期柱将在理想情况下看起来像这样:

Store_Id | Week | Dynamic_Week 
---------+--------+------------- 
    A1 | 201602 | 1 
    A1 | 201603 | 2 
    A1 | 201605 | 4 
    A1 | 201606 | 5 
    A1 | 201607 | 6 
    A2 | 201552 | 1 
    A2 | 201603 | 4 
    A2 | 201604 | 5 
    A2 | 201605 | 6 
    A2 | 201608 | 9 

逻辑是:每个商店的MIN(周)被认为是相应商店的第一周销售。动态周中的前几个值将根据每个商店的第一周销售额的参考值递增。

我试过Row_Number(),RANK(),DENSE_RANK(),但无法获得所需的解决方案。所有这三件事情都没有奏效。

任何人都可以提出可能的解决方案。

在此先感谢。

+0

可以具有每特定STOREID含柱分钟(周),然后减去它们用于动态周。 –

回答

1

编辑:作出的动态查询处理任何一套百年来,不只是1

New Restester Sample

select d.* 
,((d.week-m.min_w+1) 
    -(48*(cast(left(d.week,4) as int) 
     - cast(left(min_w,4) as int) 
     ) 
    ) 
)as dynamic_week 
from dynw d 
inner join (select store_id,min(week) min_w 
      from dynw 
      group by store_id 
      ) m 
on d.store_id=m.store_id 
order by 1,2 

输出,用于更复杂的样品

+----------+--------+--------------+ 
| Store_Id | Week | dynamic_week | 
+----------+--------+--------------+ 
| A1  | 201602 |   1 | 
| A1  | 201607 |   6 | 
| A2  | 201552 |   1 | 
| A2  | 201603 |   4 | 
| A2  | 201704 |   57 | 
| A3  | 201352 |   1 | 
| A3  | 201601 |   106 | 
+----------+--------+--------------+ 

上一页: 这是你所需要的。尽管您的示例数据和预期数据不匹配,但 此解决方案仅适用于跨越1年的store_id。除此之外,您必须稍微更改查询。但对于你的样品来说,这是有好处的。

Restester Sample

SELECT t1.*, 
     CASE 
      WHEN (t1.week-t.week1+1)>=52 
      THEN (t1.week-t.week1+1)-48 
      ELSE (t1.week-t.week1+1) 
     END AS dynamic_week 
FROM table1 t1 
INNER JOIN 
    (SELECT store_id, 
      min(week) AS week1 
    FROM table1 
    GROUP BY store_id) t 
ON t1.store_id=t.store_id 

输出,用于我的样品

+----------+--------+--------------+ 
| Store_Id | Week | dynamic_week | 
+----------+--------+--------------+ 
| A1  | 201602 |   1 | 
| A1  | 201604 |   3 | 
| A1  | 201606 |   5 | 
| A1  | 201607 |   6 | 
| A2  | 201552 |   1 | 
| A2  | 201603 |   4 | 
| A2  | 201604 |   5 | 
| A2  | 201605 |   6 | 
| A2  | 201608 |   9 | 
+----------+--------+--------------+ 
+0

嘿Utsav,我知道你是怎么到达这个因子48的? @Utsav –

+0

如果201602为第一周,那么201604为'201604-201602 + 1' ='3'。现在如果201551是第1周,而201602应该是第4周,则不能简单地用'201551'减去'201602'并将结果作为'4'。作为'100 - 52' ='48',你应该使用48的倍数。 注意:如果你想从2013年到2017年计数,那么你应该在减去时使用因子“48 * 3”。 – Utsav

+0

编辑答案使“48”动态变化的因子 – Utsav

1
select a.storeID,a.week,b.min_week,(a.week-b.min_week+1) as Dynamic_week 
from 
table1 as a 
join 
(select distinct storeId,min(week) as min_week from table1 group by 1) as b 
where a.store_id=b.store_id 

我不知道这将SQL服务器上工作,我不习惯到SQL服务器进行此代码comapatible的SQL服务器