last_Value函数的使用(SQL SERVER 2012RC)

本文通过具体实例展示了如何在SQL中使用LAST_VALUE函数来获取指定字段的最后一个值,包括不分组和按ID分组的情况,并简要提及了FIRST_VALUE函数的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时常, 我们想取回最值记录, 比如,最后日期什么的,

看一个例子,

if OBJECT_ID('test','u') is not null
drop table test
go
create table test(
Id int,
Name nvarchar(50),
Date date,
Amount int)
go
insert into test(Id,Name,Date,Amount)
values
(1,'张三','2011-01-22',15),
(1,'张三','2011-01-28',20),
(2,'李四','2011-01-02',5),
(2,'李四','2011-01-18',8),
(2,'李四','2011-02-14',17)
go
select * from test


现在, 我们想要最后日期的记录, 可以使用LAST_VALUE函数,

select Id,Name,Date,Amount,
LAST_VALUE(Id) over(order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastId,
LAST_VALUE(Name) over(order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastName,
LAST_VALUE(Amount) over(order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastAmount
					from test
					order by Id

如果我们想要按照ID分组呢?,非常简单,

select Id,Name,Date,Amount,
LAST_VALUE(Id) over(PARTITION BY ID order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastId,
LAST_VALUE(Name) over(PARTITION BY ID order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastName,
LAST_VALUE(Amount) over(PARTITION BY ID order by Date RANGE BETWEEN UNBOUNDED PRECEDING
                    AND UNBOUNDED FOLLOWING) as LastAmount
					from test
					order by Id


FIRST_VALUE使用和LAST_VALUE一样,

-- 创建数据库(使用英文符号) CREATE DATABASE IF NOT EXISTS `work_data` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `work_data`; -- 社群信息表 CREATE TABLE IF NOT EXISTS `group_info` ( `group_name` VARCHAR(50) PRIMARY KEY COMMENT '社群名称', `member_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '社群人数', `create_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期', `last_update` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新' ) ENGINE=InnoDB; -- 社群问题表 CREATE TABLE IF NOT EXISTS `group_issues` ( `issue_id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `group_name` VARCHAR(50) NOT NULL COMMENT '社群名称', `issue_type` VARCHAR(20) NOT NULL DEFAULT '其他' COMMENT '问题类型', `description` TEXT NOT NULL COMMENT '问题描述', `report_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登记日期', `is_solved` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否解决', `solve_date` DATETIME NULL COMMENT '解决日期', FOREIGN KEY (`group_name`) REFERENCES `group_info`(`group_name`) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB; -- 订单表 CREATE TABLE IF NOT EXISTS `orders` ( `order_id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `user_name` VARCHAR(50) NOT NULL COMMENT '用户名称', `group_name` VARCHAR(50) NOT NULL COMMENT '所属群名', `amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额', `status` ENUM('已付款','待付款','已退款') NOT NULL DEFAULT '待付款' COMMENT '订单状态', `order_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单日期', FOREIGN KEY (`group_name`) REFERENCES `group_info`(`group_name`) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB; CREATE VIEW `group_analytics_view` AS SELECT gi.`group_name` AS `社群名称`, gi.`member_count` AS `群人数`, COUNT(DISTINCT o.`user_name`) AS `下单总人数`, SUM(CASE WHEN o.`status` = '已付款' THEN o.`amount` ELSE 0 END) AS `总金额`, ROUND(COUNT(DISTINCT o.`user_name`) / GREATEST(gi.`member_count`, 1), 4) AS `转化率`, -- 修正后的复购率计算 ROUND( IFNULL( (SELECT COUNT(*) FROM ( SELECT `user_name` FROM `orders` sub_o WHERE sub_o.`group_name` = gi.`group_name` GROUP BY `user_name` HAVING COUNT(*) >= 2 ) AS rep_users ), -- 此处增加闭合括号 0 ) / GREATEST(COUNT(DISTINCT o.`user_name`), 1), 4 ) AS `复购率`, COUNT(gi.`issue_id`) AS `问题次数`, MAX(o.`order_date`) AS `最后下单日期` FROM `group_info` gi LEFT JOIN `orders` o ON gi.`group_name` = o.`group_name` LEFT JOIN `group_issues` gi ON gi.`group_name` = gi.`group_name` GROUP BY gi.`group_name`;
05-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值