sql分组取最大最小

--测试数据
if object_id('tempdb..#t') is not null
drop table #t
create table #t(
col1 varchar(50),
col2 varchar(50),
col3 numeric(18,6))

insert into #t 
select 'HRB16','2012-06-14 04:52:55.000','93.99' union all 
 select 'HRC33','2012-06-15 23:11:14.000','88.50' union all 
 select 'HRC33','2012-06-16 07:07:23.000','82.82' union all 
 select 'HRC35','2012-06-15 07:57:44.000','95.86' union all 
 select 'HRC35','2012-06-16 09:38:30.000','93.99' union all 
 select 'HRC36','2012-06-16 12:58:14.000','80.32' union all
select 'HRC36','2012-06-16 12:59:14.000','81.32' 

--sql语句


select min(col3) from #t a Where exists(select 1 From #t b where col1 = a.col1 and col2 < a.col2)

select min(col3) from #t a where col2 = (select max(col2) from #t b where a.col1 = b.col1)
 

### SQL 中按组获每组最新记录的方法 为了在 SQL 查询中对数据进行分组后获每个分组中的最新记录,可以根据不同的数据库管理系统采用多种策略。以下是几种常见的方式: #### 使用窗口函数 `ROW_NUMBER()` 对于支持窗口函数的数据库(如 Oracle 和 Microsoft SQL Server),可以利用 `ROW_NUMBER()` 函数来分配唯一的行号给每一组内的记录,按照某个特定字段(通常是日期或时间戳)降序排列。这样就可以轻松筛选出具有最小编号的那一行作为该组最晚发生的事件。 ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_column ORDER BY timestamp_column DESC) AS rn FROM your_table_name ) t WHERE rn = 1; ``` 此查询语句通过创建一个派生表,在其中计算各分区下的相对位置,最终只保留那些被标记为首项的结果[^3]。 #### 利用子查询与聚合函数组合 另一种通用的做法是在外部查询中引用内部的一个子查询,后者负责找出各个类别下符合条件的最大键值(比如 ID 或者 时间戳)。这种方法适用于大多数关系型数据库系统,包括 MySQL 和 PostgreSQL。 ```sql SELECT main.* FROM your_table_name AS main JOIN ( SELECT category_column, MAX(timestamp_column) AS latest_time FROM your_table_name GROUP BY category_column ) sub ON main.category_column = sub.category_column AND main.timestamp_column = sub.latest_time; ``` 这里的关键在于构建了一个临时结果集 `sub` ,它包含了每一个类别的唯一标识以及对应的最高版本的时间戳;接着再将其与原始表格做连接操作以提完整的记录信息[^4]。 #### 应用 TOP 子句配合 ORDER BY (仅限于某些 RDBMS) 如果所使用的数据库允许,则可以直接应用 `TOP` 关键字加上适当排序规则来简化上述过程。不过需要注意的是,这种方式非所有平台都兼容,具体决于实际环境的支持情况。 ```sql WITH RankedRecords AS ( SELECT TOP(1) WITH TIES * FROM your_table_name PARTITION BY category_column ORDER BY timestamp_column DESC ) SELECT * FROM RankedRecords; ``` 这段代码片段展示了如何借助 CTE(Common Table Expression) 结构结合 `TOP` 来达到目的,但同样受限于具体的 DBMS 版本特性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值