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