mysql 查询重复数据取其中一条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 查询重复数据取其中一条相关的知识,希望对你有一定的参考价值。

mysql 有3个字段,其中一个字段(unmber)有重复,一个number对应多个log_id,其中每个number对应的log_id有重复,另外一个时间(i_time),我想按时间排序,把每个number只取时间最近的一条,且结果要全部字段数据:
SELECT log_id,number,
SUBSTRING_INDEX( GROUP_CONCAT(i_time ORDER BY i_time DESC),',','1' ) AS atime
FROM T1 WHERE number IN ('123456','223456') GROUP BY log_id,number;
这样取到的结果因为log_id有重复会出现两条,怎么只取一条呢?

参考技术A

数据

select a.* from t1 as a where i_time = (select max(i_time) from t1 where a.number=number)

查询结果

追问

用时间作为查询条件不太靠谱吧,假设百万级别的数据时间一样的不再少数

追答

如果时间和id是有序的逐渐增大,可以根据id来查,下面两种都可以
select * from t1 where id in (select max(id) from t1 group by number);
select a.* from t1 as a where id = (select max(id) from t1 where a.number=number)

参考技术B 稍等,我在看追答

试试看

SELECT T1.log_id,T1.number
FROM T1
LEFT JOIN ( SELECT MAX(log_id) AS logId
FROM T1
GROUP BY log_id,number
HAVING COUNT(*) > 1
) latest ON latest.logId = T1.log_id

追问

多谢回答,我理解您意思是要用INNER JOIN吧,有一种情况,当一个number
对应多个logId时,结果不只是一条。
例如数据:
log_id | number | i_time
------------------------------------
00001 | 123 |2016-01-23 09:28:44
00001 | 123 |2017-02-24 11:28:44
00002 | 123 |2018-03-25 23:18:04

oracle 取重复数据中一条

表结构id(number)类, time(date)类,可用to_char(time,'yyyy-mm-dd')表示
id不唯一,有重复,time唯一。要找出每个id最早出现的那几行数据(几个id就有几行)
select * from table group by id having count(id)>1 order by to_char(time,'yyyy-mm-dd');这样对么?不对的话应该如何写?

操作步骤:

    先按要求,针对某唯一字段,对重复数据进行分组,取max或min,结果存储到临时表

    关联原表与上一步的临时表,取到相应的数据

如:

表tt结构如下:

create table tt(
    id number,
    time date,
    others ....   其它字段
);

,  id不唯一,有重复,time唯一。

要找出每个id最早出现的那几行数据,有几个id就有几行输出。

分析:出现最早的数据,即time最小的数据,用min(time)来分组

SQL语句如下:

select t2.* from
   ( select id, min(time) tm from tt group by id ) t1, tt t2
where t1.id=t2.id and t1.tm=t2.time ;

 说明:子语句( select id, min(time) tm from tt group by id ) 就是得到每个id的最小时间列表

参考技术A select * from table_name a where a.rowid <=(select min(rowid) from table_name b where a.id=b.id) order by id asc;
这个语句是查询出id相同的记录,并按照id递增排序,试试看,如果有什么错误回复我。追问

和表b有什么关系?这个语句我见过。我不用这样,我的目的只是重复的中取一条。

追答

表b还是表a只是别名,用来区分的。这个查询是查询的同一个表。

本回答被提问者采纳

以上是关于mysql 查询重复数据取其中一条的主要内容,如果未能解决你的问题,请参考以下文章

多表查询结果出现重复记录,根据条件只取其中的一条记录的sql语句

sql中如何取重复的数据取时间最近的一条?

SQL 查询一表所有数据 有重复的按时间取第一条

mysql删除重复数据,保留一条

oracle 取重复数据中一条

Mysql删除重复记录,保留id最小的一条