当前位置: 首页> 科技> IT业 > 园林公司网站建设费用_怎么创建网站充值和提现账号_服务外包公司_中国联通业绩

园林公司网站建设费用_怎么创建网站充值和提现账号_服务外包公司_中国联通业绩

时间:2025/7/12 2:48:35来源:https://blog.csdn.net/qq_25308331/article/details/143698562 浏览次数:0次
园林公司网站建设费用_怎么创建网站充值和提现账号_服务外包公司_中国联通业绩

 窗口函数用于在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算,可以跨行计算。

随着窗口函数的出现,无须再使用关联子查询。窗口函数的可读性很好,代码也很简洁。

1 实践

1.1 营业额年度变化

需求:查找与上一年相比营业额没有变化的年份。

图 年度营业额t_year_sales 表

-- 关联子查询
SELECT *
FROM t_year_sales y1 
WHERE sale = (SELECT sale FROM t_year_sales WHERE `year` = y1.year - 1);
-- 左连接
SELECT *
FROM (SELECT y1.*,y2.sale AS preSaleFROM t_year_sales y1 LEFT JOIN t_year_sales y2 ON y2.`year` = y1.`year` - 1
) temp 
WHERE sale = preSale;
-- 窗口函数
SELECT *
FROM (SELECT *,MAX(sale) OVER ( ORDER BY `year` RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING ) AS preSaleFROM t_year_sales 
) temp 
WHERE sale = preSale;

1.1.1 时间轴有间断时:和过去最临近的时间进行比较

图 有间断的年度营业额t_year_sales2 表

需求:查询与过去最临近的年份营业额相同的年份。

-- 关联子查询 
SELECT *
FROM t_year_sales2 y
WHERE sale = (SELECT sale FROM t_year_sales2 WHERE `year` = (SELECT MAX(`year`) FROM t_year_sales2 WHERE `year` < y.year));
-- 窗口函数
SELECT *
FROM 
(SELECT *,MAX(`sale`) OVER(ORDER BY `year` ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS preSaleFROM t_year_sales2 y
) temp 
WHERE sale = preSale;

1.2 窗口函数与关联子查询

图 商品信息t_product_info 表

需求:按照商品种类查询销售单价高于平均销售单价的商品。

-- 关联子查询
SELECT *,(SELECT AVG(price) FROM t_product_info WHERE `type` = p.type) AS avgPrice
FROM t_product_info p 
WHERE price > (SELECT AVG(price) FROM t_product_info WHERE `type` = p.type);
-- 关联子查询
SELECT *
FROM (SELECT *,AVG(price) OVER (PARTITION BY `type`) AS avgPriceFROM t_product_info
) temp
WHERE price > avgPrice;

1.3 查询重叠的时间区间

图 酒店预约t_reservation2表

需求:查找出重叠时间的预定

-- 关联子查询
SELECT *
FROM t_reservation2 r 
WHERE EXISTS 
(SELECT *FROM t_reservation2 r1WHERE r1.reserver != r.reserver AND (r.start_date BETWEEN r1.start_date AND r1.end_dateOR r.end_date BETWEEN r1.start_date AND r1.end_date	OR (r.start_date <= r1.start_date AND r.end_date >= r1.end_date))
);

这个需求窗口函数较难实现。

1.4 移动平均值

图 银行账户存取款记录t_account表

需求:求当前取款额及最近三次平均取款额(当前行+前两行。当前两行记录不全时,根据既有数据求平均值)。

-- 窗口函数
SELECT *,AVG(amount) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS avgAmount
FROM t_account;
-- 关联子查询
SELECT *,(SELECT AVG(amount) FROM t_account WHERE `date` <= a.date LIMIT 3) AS avgAmount
FROM t_account a; 

需求:上面需求改为,当记录少于3行,平均值为NULL。

-- 窗口函数
SELECT *,
CASE WHEN COUNT(*) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) < 3 THEN NULL 
ELSE AVG(amount) OVER (ORDER BY `date` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)  END AS avgAmount
FROM t_account;
-- 关联子查询
SELECT *,
CASE WHEN (SELECT COUNT(*) FROM t_account WHERE `date` <= a.date) < 3 THEN NULL 
ELSE (SELECT AVG(amount) FROM t_account WHERE `date` <= a.date LIMIT 3) END AS avgAmount
FROM t_account a; 
关键字:园林公司网站建设费用_怎么创建网站充值和提现账号_服务外包公司_中国联通业绩

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: