请教一道笔试题,第二问实在是做不出来了。

时间:2021-04-26 23:27:28
"小明"负责多个品牌的销售业绩,请完成:
(1)请统计小明负责的各个品牌,在2017年销售最高的3天,及对应的销售额。
销售表 a:
字段:logday(日期,主键组),SKU_ID(商品SKU,主键组),sale_amt(销售额)
商品基础信息表 b:
字段:SKU_ID(商品SKU,主键),bu_name(商品类目),brand_name(品牌名称),user_name(运营负责人名称)
(2)请统计小明负责的各个品牌,在2017年连续3天增长超过50%的日期,及对应的销售额。

6 个解决方案

#1


以下为题目,没有示例数据。我想到了用LAG,用row_number构建每个连续时间的标识,但是因为初学,还是不能解决这个问题。

#2




with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

#3


谢谢老师 请教一道笔试题,第二问实在是做不出来了。,我体会下,一时间有点没看懂。

#4


引用 2 楼 RINK_1 的回复:


with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点

#5


引用 4 楼 dufemt 的回复:
Quote: 引用 2 楼 RINK_1 的回复:



with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点


1、qty是为了计算以销售表中存在的每一天为基准,其后续是否存在连续的3天。
2、qty=4,说明后续有连续3天,加上基准那天,那就是总共4天。如果=3,那总共是3天,后续连续就是2天,逐天之间最多出现2个连续增长值,就是基准天到第二天,第二天到第三天。
3、不知道你说的是那段中的A.logday。

你自己可以构造些测试数据试试,我当时也是想了个大概,没有具体测试过,逻辑不一定正确。

#6


引用 5 楼 RINK_1 的回复:
Quote: 引用 4 楼 dufemt 的回复:

Quote: 引用 2 楼 RINK_1 的回复:



with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点


1、qty是为了计算以销售表中存在的每一天为基准,其后续是否存在连续的3天。
2、qty=4,说明后续有连续3天,加上基准那天,那就是总共4天。如果=3,那总共是3天,后续连续就是2天,逐天之间最多出现2个连续增长值,就是基准天到第二天,第二天到第三天。
3、不知道你说的是那段中的A.logday。

你自己可以构造些测试数据试试,我当时也是想了个大概,没有具体测试过,逻辑不一定正确。

谢谢老师,我自己又调试了下,发现真的很巧妙。厉害厉害

#1


以下为题目,没有示例数据。我想到了用LAG,用row_number构建每个连续时间的标识,但是因为初学,还是不能解决这个问题。

#2




with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

#3


谢谢老师 请教一道笔试题,第二问实在是做不出来了。,我体会下,一时间有点没看懂。

#4


引用 2 楼 RINK_1 的回复:


with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点

#5


引用 4 楼 dufemt 的回复:
Quote: 引用 2 楼 RINK_1 的回复:



with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点


1、qty是为了计算以销售表中存在的每一天为基准,其后续是否存在连续的3天。
2、qty=4,说明后续有连续3天,加上基准那天,那就是总共4天。如果=3,那总共是3天,后续连续就是2天,逐天之间最多出现2个连续增长值,就是基准天到第二天,第二天到第三天。
3、不知道你说的是那段中的A.logday。

你自己可以构造些测试数据试试,我当时也是想了个大概,没有具体测试过,逻辑不一定正确。

#6


引用 5 楼 RINK_1 的回复:
Quote: 引用 4 楼 dufemt 的回复:

Quote: 引用 2 楼 RINK_1 的回复:



with cte_1
as
(select A.logday,A.sale_amt,B.brand_name
 from 销售表 A
 join 商品基础信息表 B on A.SKU_ID=B.SKU_ID
 where user_name='小明' and YEAR(logday)='2017'),
 
cte_2
as
(select A.logday,B.sale_amt,B.brand_name,
 COUNT(*) over (partition by A.logday) AS qty,
 1.5*lag(sale_amt,1,0) over (partition by A.logday order by B.logday) as last_amt
 from cte_1 A
 join cte_1 B on A.brand_name=B.brand_name and B.logday between A.logday and DATEADD(DAY,3,A.logday))
 
select * from cte_2 A
where qty=4
and not exists (select 1 from cte_2 where A.logday=logday and A.brand_name=brand_name and sale_amt<last_amt)

您好,我没有想明白cte_2中的qty是什么意思,以及最外层查询中的qty=4,还有cte_中的SELECT为什么是A.logday。
还望指点


1、qty是为了计算以销售表中存在的每一天为基准,其后续是否存在连续的3天。
2、qty=4,说明后续有连续3天,加上基准那天,那就是总共4天。如果=3,那总共是3天,后续连续就是2天,逐天之间最多出现2个连续增长值,就是基准天到第二天,第二天到第三天。
3、不知道你说的是那段中的A.logday。

你自己可以构造些测试数据试试,我当时也是想了个大概,没有具体测试过,逻辑不一定正确。

谢谢老师,我自己又调试了下,发现真的很巧妙。厉害厉害