You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
使用窗口函数,计算过去 7 天的总的消费额,作为临时表 tmp2 select sum(sum_amount) sum_amount over (order by to_days(visited_on) range between 6 preceding and current row) as sum_amount from tmp1
SELECT
visited_on,
sum_amount amount,
ROUND( sum_amount /7, 2 ) average_amount
FROM (
SELECT
visited_on,
SUM( sum_amount ) OVER ( ORDER BY to_days(visited_on) RANGE BETWEEN 6 PRECEDING AND current ROW ) sum_amount
FROM (
SELECT
visited_on,
SUM( amount ) sum_amount
FROM Customer
GROUP BY visited_on
) tmp1
) tmp2
WHERE DATEDIFF(visited_on, ( SELECTMIN( visited_on ) FROM Customer )) >=6;
上面 sql 可以简化一下,不过有问题,就是如果时间不连续,排序不会跳过。
也就是说 rk > 7 只能筛选出连续 7 天的数据
SELECT
visited_on,
amount,
SUM( amount /7, 2 ) average_amount
FROM (
SELECT
visited_on,
RANK() OVER ( ORDER BY visited_on ) AS rk,
SUM(SUM( amount )) OVER ( ORDER BY visited_on RANGE INTERVAL 7-1 DAY PRECEDING ) AS amount
FROM Customer GROUP BY visited_on
) AS tep WHERE rk >=7ORDER BY1
方法二
此方法是使用自连,连接的条件是时间连续 7 天,这个方法如果时间不连续,就会有问题
WITH t AS (
SELECT visited_on, SUM( amount ) amount FROM Customer GROUP BY visited_on
)
SELECTa.visited_on, SUM( b.amount ) amount, ROUND( AVG( b.amount ), 2 ) average_amount
FROM t a, t b
WHERE DATEDIFF( a.visited_on, b.visited_on ) BETWEEN 0AND6GROUP BYa.visited_onCOUNT(*) =7;
方法三
SELECTa.visited_on,
sum( b.amount ) AS amount,
round( sum( b.amount ) /7, 2 ) AS average_amount
FROM
( SELECT DISTINCT visited_on FROM Customer ) a
JOIN Customer b ON datediff( a.visited_on, b.visited_on ) BETWEEN 0AND6WHEREa.visited_on>= ( SELECTmin( visited_on ) FROM Customer ) +6GROUP BYa.visited_onORDER BY visited_on
The text was updated successfully, but these errors were encountered:
题目
题目链接:餐馆营业额变化增长
你是餐馆的老板,现在你想分析一下可能的营业额变化增长(每天至少有一位顾客)。
计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值。average_amount 要 保留两位小数。
结果按 visited_on 升序排序。
返回结果格式的例子如下。
本题考察的知识是如何累加一段时间区间内的值
有两种实现方式:
6 PRECEDING AND current ROW
就能查找出来了(方案一)DATEDIFF
函数,这个函数可以计算两个日期之间的天数,然后使用BETWEEN
条件(方案二和方案三)解析
要知道过去
7
天的平均消费额,需要先知道每天的总消费额,作为临时表tmp1
select visited_on, sum(amount) sum_amount from Customer group by visited_on
使用窗口函数,计算过去
7
天的总的消费额,作为临时表tmp2
select sum(sum_amount) sum_amount over (order by to_days(visited_on) range between 6 preceding and current row) as sum_amount from tmp1
计算过去
7
天的平均消费额,作为临时表tmp3
select visited_on, sum_amount amount, sum_amount / 7 as average_amount from tmp2
筛选出计算数据大于等于七天的数据
tmp4
select min(visited_on) min_visited_on from Customer
datediff(expr1, expr2)
函数,计算两个日期之间的天数,这里需要大于等于6
天select visited_on, amount, round(average_amount, 2) average_amount from tmp3 where datediff(visited_on, (select min(visited_on) from Customer)) >= 6
最终
sql
语句如下:上面
sql
可以简化一下,不过有问题,就是如果时间不连续,排序不会跳过。也就是说
rk > 7
只能筛选出连续7
天的数据方法二
此方法是使用自连,连接的条件是时间连续
7
天,这个方法如果时间不连续,就会有问题方法三
The text was updated successfully, but these errors were encountered: