`

如何一条sql语句取出分组数据中值最大的

 
阅读更多
--按某一字段分组取最大(小)值所在行的数据(2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          3           a3:a的第三个值
b          5           b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
b          1           b1--b的第一个值
*/

--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
*/

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
b          5           b5b5b5b5b5
*/

--五、按name分组取最小的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
b          2           b2b2b2b2
*/

--六、按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          2           a2(a的第二个值)
a          3           a3:a的第三个值
b          4           b4b4
b          5           b5b5b5b5b5
*/
create table tb(id1 int,id2 int,a int,b int ,c int)
insert into tb values(1, 1, 5, 4, 3) 
insert into tb values(2, 1, 8, 6, 4) 
insert into tb values(1, 2, 6, 7, 2) 
insert into tb values(2, 2, 10, 5, 4) 
insert into tb values(1, 3, 10, 1, 1) 
insert into tb values(2, 3, 12, 2, 2)
go

--方法1:
select a.* from tb a where a = (select max(a) from tb where id2 = a.id2) order by a.id2
--方法2:
select a.* from tb a where not exists(select 1 from tb where id2 = a.id2 and a > a.a) order by a.id2
--方法3:
select a.* from tb a,(select id2,max(a) a from tb group by id2) b where a.id2 = b.id2 and a.a = b.a order by a.id2
--方法4:
select a.* from tb a inner join (select id2 , max(a) a from tb group by id2) b on a.id2 = b.id2 and a.a = b.a order by a.id2
--方法5
select a.* from tb a where 1 > (select count(*) from tb where id2 = a.id2 and a > a.a ) order by a.id2

drop table tb

/*
id1         id2         a           b           c           
----------- ----------- ----------- ----------- ----------- 
2           1           8           6           4
2           2           10          5           4
2           3           12          2           2

(所影响的行数为 3 行)

id1         id2         a           b           c           
----------- ----------- ----------- ----------- ----------- 
2           1           8           6           4
2           2           10          5           4
2           3           12          2           2

(所影响的行数为 3 行)

id1         id2         a           b           c           
----------- ----------- ----------- ----------- ----------- 
2           1           8           6           4
2           2           10          5           4
2           3           12          2           2

(所影响的行数为 3 行)

id1         id2         a           b           c           
----------- ----------- ----------- ----------- ----------- 
2           1           8           6           4
2           2           10          5           4
2           3           12          2           2

(所影响的行数为 3 行)

id1         id2         a           b           c           
----------- ----------- ----------- ----------- ----------- 
2           1           8           6           4
2           2           10          5           4
2           3           12          2           2

(所影响的行数为 3 行)
*/
 
分享到:
评论

相关推荐

    midfilter.zip_一维中值滤波_平滑数据_数据处理_数据平滑_数据平滑处理

    一维中值滤波是一种非线性的信号处理技术,常用于去除噪声,特别是在一维数据序列如时间序列分析中。这种滤波方法基于排序统计,它通过替换输入序列中的每个点(像素)值为该点邻域内的中值来工作。在MATLAB中实现一...

    一维中值滤波.

    一维中值滤波是一种非线性的信号处理技术,常用于去除噪声,特别是椒盐噪声或脉冲噪声。这种滤波方法基于一个基本思想:在一段连续的数据序列中,噪声通常表现为异常值,而正常信号则更接近于周围的平均值。中值...

    在MATLAB中对三维点云数据进行中值滤波

    在MATLAB中对三维点云数据进行中值滤波是一个重要的图像处理步骤,常用于去除噪声,特别是针对具有高斯噪声或椒盐噪声的点云数据。中值滤波是一种非线性的滤波方法,它在处理噪声时具有独特的优势,能够保留边缘信息...

    查找链表中值最大的节点

    递归的方式查找链表中值最大的节点,用于交流学习。 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成...

    C# 加工好拿来(SQl语句查询)

    总的来说,“C# 加工好拿来(SQl语句查询)”这一主题涉及到C#编程、Excel数据处理、SQL查询构建等多方面知识,对于数据驱动的开发工作具有很高的实用价值。通过理解并掌握这些技能,开发者可以更有效地在数据库和...

    数据处理 中值滤波 幅值测算

    数据处理,给进数组利用c#进行可变窗口的中值滤波,滤波后进行幅值测算

    SQL语句入门到进阶

    SQL提供了一些内置的聚合函数,如COUNT、SUM、AVG、MAX和MIN,用于计算一组值的总和、平均值、最大值和最小值。 - COUNT:返回指定列的行数。 ```sql SELECT COUNT(column) FROM table_name; ``` 十、GROUP BY和...

    在SQL Server 2005里更简单地计算中值.pdf

    在数据分析和统计学中,中值(median)是衡量数据集中趋势的一个重要指标,它是将数据集从小到大排序后位于中间位置的数值。若数据集的个数为奇数,中值即为中间的数值;若为偶数,则为中间两个数值的平均值。中值...

    Oracle SQL 语句学习

    SELECT语句是SQL中用于数据查询的基本语句,它可以从一个或多个表中获取数据。SELECT语句的基本语法结构包括SELECT和FROM两个关键字,SELECT后面是要检索的列名或表达式,而FROM后面是要查询的表名。如果要从多个表...

    经典的sql查询语句大全,适合初学者,很详细

    1. **SELECT语句**:这是SQL中最基础也最常用的语句,用于从数据库中获取数据。基础形式如`SELECT column1, column2 FROM table_name;`,可以指定要查询的列名,或使用`*`代表所有列。 2. **WHERE子句**:WHERE用于...

    zh.rar_一维 中值滤波_一维中值滤波_一维滤波器_中值滤波器_中值滤波器 matlab

    中值滤波器 采用的是对二维图像,进行两次一维中值滤波,算法简单且易实现

    使用c++语言对采集非线性数据进行中值滤波

    中值滤波是一种非线性的滤波方法,它对数据序列中的每一个点取其邻域内数值的中位数作为该点的新值,以此来平滑信号并去除噪声。这种方法特别适合于处理脉冲噪声或者尖峰噪声,因为它能够有效地保护边缘信息,避免像...

    SQL语句教程简洁入门版

    一个良好的SQL基础对于数据库管理员、数据分析师和软件开发人员来说至关重要。对于初学者而言,了解和掌握SQL的基本知识是开始数据库编程旅程的关键。 ### SQL基本指令 - **SELECT**:这是SQL中最常用的操作之一,...

    zhongzhi.zip_数据 中值滤波

    中值滤波是一种广泛应用在数字图像处理和信号处理中的非线性滤波方法,它能够有效地去除噪声,尤其是椒盐噪声。在这个名为"zhongzhi.zip"的压缩包文件中,我们关注的是中值滤波的算法实现,具体通过C语言编写的...

    软考SQL语句复习资料

    `COUNT`(统计行数或列中值的个数)、`SUM`(计算列值总和)、`AVG`(计算平均值)、`MAX`(求最大值)和`MIN`(求最小值)。 - 联结查询: 包括等值联结(`From 表1, 表2 Where 表1.列 = 表2.列`)和非等值联结...

    matlab 中值滤波 均值滤波

    1. **中值滤波**:是一种非线性的滤波方法,主要用于消除“椒盐”噪声。其基本原理是通过将滑动窗口内的像素按照亮度值排序后取中值作为中心像素的新值,以此来实现去噪的目的。 2. **均值滤波**:也称为算术平均...

    sql语句基础总结

    GROUP BY用于根据一个或多个列对数据进行分组,`SELECT column1, COUNT(*) FROM table GROUP BY column1` 将返回每组column1的行数。HAVING则用于在GROUP BY之后进行条件筛选。 ALIAS用于为列或表创建别名,提高...

    一维中值滤波函数matlab程序

    一维中值滤波函数,调用函数,输入滤波窗口值和初始一维滤波向量,输出滤波后的向量

    一种改进的中值滤波法

    实验数据表明,对于一维信号,改进的递归中值滤波只需要一步迭代就能收敛到根信号,而在传统的中值滤波中通常需要多步迭代。 #### 4. 结论 本文提出了一种改进的中值滤波算法,通过引入阈值分解技术来增强滤波性能...

    中值滤波Verilog代码

    4. **写回结果**:将计算得到的中值写回到输出图像的数据流中,继续滑动窗口进行下一轮处理。 5. **边界处理**:在处理图像边缘时,需要考虑边界条件,可能需要填充零或者镜像扩展等方法来确保所有窗口位置都有足够...

Global site tag (gtag.js) - Google Analytics