从多个列中仅选择唯一记录

时间:2019-04-08 17:40:35

标签: mysql sql

我有一个表,该表按IP,版本和平台记录下载。手动查看该表,我看到很多重复项,其中所有三个值都相同。 (用户可能只是不耐烦)我想使用SELECT语句来过滤出重复项,并且仅当所有三个值都相同时才返回条目之一。如果可能的话,甚至更高级,我还有一个使用CURRENT_TIMESTAMP的日期/时间字段。如果我可以包括重复的副本(如果它们来自不同的日期,但没有不同的时间),那将是很好的。因此,我可以查看同一位用户是否在另一天再次下载。

我主要是想获取每天有多少独立用户下载每个版本的统计数据。数据库表的结构很简单...

密钥(AUTO_INCREMENT),日期(CURRENT_TIMESTAMP),ip,用户代理,平台,版本

该软件具有Windows和Mac版本(平台),我提供了当前版本以及进行重大更改之前的一些不同的过去版本。

3 个答案:

答案 0 :(得分:1)

仅按要排除重复的字段分组,例如

SELECT ip, platform, version, COUNT(*) AS number_of_tries, max(download_date) AS last_download_date 
FROM downloads
GROUP BY ip, platform, version, DATE(download_date)

然后相对容易地对按天分组的结果进行一些更高级的过滤,等等。

答案 1 :(得分:0)

这是您想要的吗?它返回每个日期的ip / platform / version组合的第一条记录:

select t.*
from <tablename> t
where t.datetime = (select min(t2.datetime)
                    from <tablename> t2
                    where t2.ip = t.ip and
                          t2.platform = t.platform and
                          t2.version = t.version and
                          date(t2.datetime) = date(t.datetime)
                   );

答案 2 :(得分:0)

可以使用row_number()

mysql 8.0+版本

select * from (select *,
row_number()over(partition by ip,platform,date(datetime) order by datetime) rn
       from table_name 
) a where a.rn=1