mysql根据列分组并获取相同值中的记录

2020-11-30 06:52:24 字数 5965 阅读 1380

1楼:上官三云

使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值为1的记录即可。

目前主流的数据库都有支持分析函数,很好用。

其中,partition by 是指定按哪些字段进行分组,这些字段值相同的记录将在一起编号;order by则是指定在同一组中进行编号时是按照怎样的顺序。

sql根据某一个字段重复只取第一条数据

2楼:

使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值为1的记录即可。

目前主流的数据库都有支持分析函数,很好用。

其中,partition by 是指定按哪些字段进行分组,这些字段值相同的记录将在一起编号;order by则是指定在同一组中进行编号时是按照怎样的顺序。

示例(sql server 2005或以上适用):

selects.*

from(

select*,row_number()over(partitionby[手机号]orderby[店铺])asgroup_idx

fromtable_name

)swheres.group_idx=1

3楼:隐匿望默念

**如下:

select * from tbl_dpimg where id in (select min(id) from tbl_dpimg group by dpid)

处理后结果为:

查找表中多余的重复记录,重复记录是根据单个字段(teamid)来判断

select * from team where teamid in (select teamid from team group by teamid having count(teamid) > 1)

删除表中多余的重复记录,重复记录是根据单个字段(teamid)来判断,只留有rowid最小的记录

delete from team where

teamname in(select teamname from team group by teamname having count(teamname) > 1)

and teamid not in (select min(teamid) from team group by teamname having count(teamname)>1)

扩展资料

数据记录筛选:

sql="select * from 数据表 where字段名=字段值 order by字段名[desc]"(按某个字段值降序排列。默认升序asc)

sql="select * from 数据表 where字段名like '%字段值%' order by 字段名 [desc]"

sql="select top 10 * from 数据表 where字段名=字段值 order by 字段名 [desc]"

sql="select top 10 * from 数据表 order by 字段名 [desc]"

sql="select * from 数据表 where字段名in ('值1','值2','值3')"

sql="select * from 数据表 where字段名between 值1 and 值2"

4楼:匿名用户

用group by 最后一个字段 用个max()

5楼:发生等将发生

如果仅仅只是查询出来去从,那么就用distinctselect distinct 需要去重的列明(允许多列) from table

如果是需要在表中删除,可以这样处理

1、建立临时表,将重复记录查询出来去重插入到临时表2、删除实表中的重复记录

3、将临时表中的记录插入到实表

处理完成

6楼:匿名用户

select * into ##tmp_table from 表where 1=2

declare @phoneno int

declare cur cursor forselect 手机号 from 表 group by 手机号open cur

fetch next from cur into @phonenowhile @@fetch_status=0begin

insert into ##tmp_tableselect top 1 from 表 where 手机号=@phoneno

fetch next from cur into @phonenoendselect * from ##tmp_tabledrop table ##tmp_table

7楼:匿名用户

最简单的 select distinct (手机号)

8楼:老汉肆

select

temp.id,

temp.device_id,

temp.update_dtm,

temp.test_result

from (

select

t.id,

t.device_id,

t.update_dtm,

t.test_result,

row_number() over(partition by device_id order by t.update_dtm desc) as row_***

from device_info_tbl t ) tempwhere temp.row_*** = '1'

sql按字段分组,并且找出每组的第一条数据

9楼:匿名用户

不知道你什

么数据库,给出sqlserver和oracle的select星期,字母

from

(selectrank()over(partitionby星期orderby字母desc)id,*

from表)t1

whereid=1

或者select星期,max(字母)

from表

groupby星期

10楼:匿名用户

select星期,max(字母)as字母from表groupby星期

mysql 分组查询,再按照时间倒序取出第一条数据的某个字段值

11楼:司马铸剑

# mysql不支持其它复杂数据库的类似 rank() over 的排名和统计查询

# 只能通过变通的子查询和逻辑计算方式来实现,对于中小数据量可以考虑

-- rank 排名实现

select inline_rownum, aa, cc, amt, orderid from

(select

# logic_cal 只是实现计数器计算的,每次逐条查询时会对比当前 cc 与 @last_cc 是否相同,如果不同则把当前该列值赋于 @last_cc 并重设计数器 @num := 1,否则计数器自加 @num := @num + 1

(case when cc <> @last_cc then concat(@last_cc := cc, @num := 1 ) else concat(@last_cc, @num :

= @num + 1) end ) logic_cal

, @num as inline_rownum

, aa, cc, amt, orderid

from tb_rank,

( select @last_cc := '') t, # 初始化 @last_cc 为 '', 如要检查的列(基于计数器统计的列)是int型,则初始化为0; varchar型初始化为''

( select @num := 0 ) t2 # 初始化@num为0

order by cc, orderid asc # 排序的方式会影响@num的生成,因为logic_cal是逐行计算的

) twhere inline_rownum <= floor(amt*0.8) #限制条数,取常量值或其他

order by cc,orderid asc;

如何使用mysql查询某个列中相同值的数量统计

12楼:匿名用户

可以通过用该字段分组计数获得。例如:

select col1,count(col1) as **tfrom t1 group by col1;

这个查询可返回表t1的字段col1中每个值的重复次数。

13楼:屈媛龙德惠

题主可以参考下列语句

select

colname,count(1)

as**t

from

tablename

group

bycolname;

如果只统计有重复的列值

select

colname,count(1)

as**t

from

tablename

group

bycolname

having

count(1)>1;

mysql表里数据分类,分类后显示每组分类里面第一条记录

14楼:匿名用户

mysql不支持first函数,如果数据表里含有自增id字段的,可以利用该字段单纯依靠sql语句实现检索出每组的第一条记录,否则就要使用系统开销很大的游标来解决了。

下面提供一个利用自增id来只显示每个分类第一条记录的纯sql语句方案供参考:

select a.* from t1 a,(select 分组字段,min(id) as id from t1 group

by 分组字段) b where a.id=b.id;

mysql按字段分组取最大值记录

15楼:唐城冬

其实这个方法有问题应该这样写

select table1_id,max(age) age from table2 group by table1_id

你的where条件 a.table1_id=table1_id是判断当前table1_id的值age是不是最大的

在mysql数据库中如何让某个字段有重复的只取一条

16楼:鱼尾挚爱白菜

select *

from table ###

where not exists (

select * from table ###where # = #

and ## < ##

)在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,只有用二重循环查询来解决。

给个例子把,比如:表table_a 4条数据id a b c d

01 ab 1a2 1b2 121

02 ab 2a3 3b3 4a1

03 ac 1a2 1b2 121

04 ac 2a4 3b2 52g

何让a字段重复取条 比

01 ab 1a2 1b2 121

03 ac 1a2 1b2 121

保留相同a值id行

select *

from table_a a

where not exists (

select 1 from table_a bwhere b.a = a.a

and b.id < a.id)

怎么查询表中某个字段相同值的记录数大于1的记录

1楼 匿名用户 表结构呢? select from tab where 商品编码 in select 商品编码 from tab group by 商品编码 having count 1 2楼 匿名用户 select 商品编码 ,count from 表名 guoup by 商品编码 having ...