计算每月重置的每天不同的值(大查询)
Calculate distinct values per day that resets each month (Big Query)
如果我有这样的 table,其中包含商店的唯一 ID 和他们下订单的日期
store_id
order_date
一个
21 年 6 月 1 日
一个
02-Jun-21
B
02-Jun-21
C
02-Jun-21
一个
21 年 6 月 3 日
一个
21 年 6 月 4 日
D
21 年 6 月 4 日
一个
21 年 7 月 1 日
B
21 年 7 月 1 日
我需要按天汇总,但每天应该只包含以前从未出现过的 store_id,并且每个月都会重置。
最终结果应该是这样的:
order_date
计数商店
21 年 6 月 1 日
1
02-Jun-21
2
21 年 6 月 3 日
0
21 年 6 月 4 日
1
21 年 7 月 1 日
2
- 6 月 1 日,只存储 A 订单,所以它是 1
- 6月2日,A店、B店、C店下单,因A店之前有下单,将被排除
- 6月3日,应该是0,因为只有之前有下单的店铺A有订单
- 在 7 月 1 日,它会重置,因此商店 A 和 B 会重新计算
您可以执行相关子查询以仅保留每个月的第一个条目:
Select order_date, count(*)
From table a
Where order_date = (Select min(x.order_date) from table x
Where a.store_id=x.store_id
And Timestamp_Trunc(x.order_date,Month) = Timestamp_Trunc(a.order_date,Month)
)
Group by order_date
Order By order_date
如果你想在一个月内累计计算“唯一”商店,我建议使用row_number()
来确定商店首次出现的时间:
select order_date, countif(seqnum = 1)
from (select t.*,
row_number() over (partition by store_id, date_trunc(order_date, month)
order by order_date
) as seqnum
from t
) t
group by order_date;
第三种紧凑的替代方法是将两个查询嵌套在一起:
Select EarlyOrder as Order_Date, Count(*) as Count_Store
From (Select Store_ID, Min(Order_Date) as EarlyOrder
From table
Group By Store_ID, Date_Trunc(Order_Date, month)
)
Group By EarlyOrder
Order By EarlyOrder
如果我有这样的 table,其中包含商店的唯一 ID 和他们下订单的日期
store_id | order_date |
---|---|
一个 | 21 年 6 月 1 日 |
一个 | 02-Jun-21 |
B | 02-Jun-21 |
C | 02-Jun-21 |
一个 | 21 年 6 月 3 日 |
一个 | 21 年 6 月 4 日 |
D | 21 年 6 月 4 日 |
一个 | 21 年 7 月 1 日 |
B | 21 年 7 月 1 日 |
我需要按天汇总,但每天应该只包含以前从未出现过的 store_id,并且每个月都会重置。
最终结果应该是这样的:
order_date | 计数商店 |
---|---|
21 年 6 月 1 日 | 1 |
02-Jun-21 | 2 |
21 年 6 月 3 日 | 0 |
21 年 6 月 4 日 | 1 |
21 年 7 月 1 日 | 2 |
- 6 月 1 日,只存储 A 订单,所以它是 1
- 6月2日,A店、B店、C店下单,因A店之前有下单,将被排除
- 6月3日,应该是0,因为只有之前有下单的店铺A有订单
- 在 7 月 1 日,它会重置,因此商店 A 和 B 会重新计算
您可以执行相关子查询以仅保留每个月的第一个条目:
Select order_date, count(*)
From table a
Where order_date = (Select min(x.order_date) from table x
Where a.store_id=x.store_id
And Timestamp_Trunc(x.order_date,Month) = Timestamp_Trunc(a.order_date,Month)
)
Group by order_date
Order By order_date
如果你想在一个月内累计计算“唯一”商店,我建议使用row_number()
来确定商店首次出现的时间:
select order_date, countif(seqnum = 1)
from (select t.*,
row_number() over (partition by store_id, date_trunc(order_date, month)
order by order_date
) as seqnum
from t
) t
group by order_date;
第三种紧凑的替代方法是将两个查询嵌套在一起:
Select EarlyOrder as Order_Date, Count(*) as Count_Store
From (Select Store_ID, Min(Order_Date) as EarlyOrder
From table
Group By Store_ID, Date_Trunc(Order_Date, month)
)
Group By EarlyOrder
Order By EarlyOrder