SQL - 获取与上个月的差异摘要
SQL - get summary of differences vs previous month
我有一个 table 类似于这个:
| id | store | BOMdate |
| 1 | A | 01/10/2018 |
| 1 | B | 01/10/2018 |
| 1 | C | 01/10/2018 |
|... | ... | ... |
| 1 | A | 01/11/2018 |
| 1 | C | 01/11/2018 |
| 1 | D | 01/11/2018 |
|... | ... | ... |
| 1 | B | 01/12/2018 |
| 1 | C | 01/12/2018 |
| 1 | E | 01/12/2018 |
它包含在 BOM(月初)活跃的商店。
我如何查询它以获取当月新开的商店数量 - 上个月不活跃的商店数量?
输出应该是这样的:
| BOMdate | #newstores |
| 01/10/2018 | 3 | * no stores on previous month
| 01/11/2018 | 1 | * D is the only new active store
| 01/12/2018 | 2 | * store B was not active on November, E is new
我现在如何计算每个商店第一次处于活动状态(嵌套 select,取 MIN(BOMdate) 然后计算)。但我不知道如何检查每个月与上个月的对比。
我用的是SQL服务器,但我很想知道其他平台有什么不同。
谢谢
How do I query it to get the amount of stores that are new that month - those that where not active the previous month?
一个选项使用 not exists
:
select bomdate, count(*) cnt_new_stores
from mytable t
where not exists (
select 1
from mytable t1
where t1.store = t.store and t1.bomdate = dateadd(month, -1, t.bomdate)
)
group by bomdate
您还可以使用 window 函数:
select bomdate, count(*) cnt_new_stores
from (
select t.*, lag(bomdate) over(partition by store order by bomdate) lag_bomdate
from mytable t
) t
where bomdate <> dateadd(month, 1, lag_bomdate) or lag_bomdate is null
group by bomdate
您可以使用 TSQL 的 DATEDIFF 函数将日期与上个月的日期进行比较。
使用 NOT EXIST 可以计算上个月没有出现的商店,也可以使用从 [=17= 引入的 TSQL 的 STRING_AGG 函数获取列表中的名称] 2017.
select BOMDate, NewStoresCount=count(1),NewStores= STRING_AGG(store,',') from
yourtable
where not exists
(
Select 1 from
yourtable y where y.store=store and DATEDIFF(m,y.BOMDate,BOMDate)=1
)
group by BOMDate
我有一个 table 类似于这个:
| id | store | BOMdate |
| 1 | A | 01/10/2018 |
| 1 | B | 01/10/2018 |
| 1 | C | 01/10/2018 |
|... | ... | ... |
| 1 | A | 01/11/2018 |
| 1 | C | 01/11/2018 |
| 1 | D | 01/11/2018 |
|... | ... | ... |
| 1 | B | 01/12/2018 |
| 1 | C | 01/12/2018 |
| 1 | E | 01/12/2018 |
它包含在 BOM(月初)活跃的商店。
我如何查询它以获取当月新开的商店数量 - 上个月不活跃的商店数量?
输出应该是这样的:
| BOMdate | #newstores |
| 01/10/2018 | 3 | * no stores on previous month
| 01/11/2018 | 1 | * D is the only new active store
| 01/12/2018 | 2 | * store B was not active on November, E is new
我现在如何计算每个商店第一次处于活动状态(嵌套 select,取 MIN(BOMdate) 然后计算)。但我不知道如何检查每个月与上个月的对比。
我用的是SQL服务器,但我很想知道其他平台有什么不同。
谢谢
How do I query it to get the amount of stores that are new that month - those that where not active the previous month?
一个选项使用 not exists
:
select bomdate, count(*) cnt_new_stores
from mytable t
where not exists (
select 1
from mytable t1
where t1.store = t.store and t1.bomdate = dateadd(month, -1, t.bomdate)
)
group by bomdate
您还可以使用 window 函数:
select bomdate, count(*) cnt_new_stores
from (
select t.*, lag(bomdate) over(partition by store order by bomdate) lag_bomdate
from mytable t
) t
where bomdate <> dateadd(month, 1, lag_bomdate) or lag_bomdate is null
group by bomdate
您可以使用 TSQL 的 DATEDIFF 函数将日期与上个月的日期进行比较。
使用 NOT EXIST 可以计算上个月没有出现的商店,也可以使用从 [=17= 引入的 TSQL 的 STRING_AGG 函数获取列表中的名称] 2017.
select BOMDate, NewStoresCount=count(1),NewStores= STRING_AGG(store,',') from
yourtable
where not exists
(
Select 1 from
yourtable y where y.store=store and DATEDIFF(m,y.BOMDate,BOMDate)=1
)
group by BOMDate