【问题标题】:Select only unique records from multiple columns仅从多列中选择唯一记录
【发布时间】:2019-04-08 17:40:34
【问题描述】:

我有一个按 IP、版本和平台记录下载的表格。手动查看表格,我看到很多重复项,其中所有 3 个值都相同。 (用户可能只是不耐烦)我想使用 SELECT 语句过滤掉重复项,如果所有 3 个值都相同,则只返回其中一个条目。更高级,如果可能的话,我还有一个使用 CURRENT_TIMESTAMP 的日期/时间字段。如果我可以包含来自不同日期但不是不同时间的重复项,那就太好了。因此,我可以查看同一用户是否在另一天再次下载。

我主要只是想统计每天有多少独特的人下载每个版本。 DB表的结构很简单……

键(AUTO_INCREMENT)、日期(CURRENT_TIMESTAMP)、ip、user_agent、平台、版本

该软件有 Windows 和 Mac 版本(平台),我提供当前版本和几个不同的过去版本,这些版本在进行重大更改之前。

【问题讨论】:

    标签: mysql sql


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

      mysql 8.0+版本可以使用row_number()

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

      【讨论】:

      • 看起来我的主机使用的是 5.7。在较低版本中是否有类似的方法可以做到这一点?
      • @Dan 从 8 开始在 mysql 中不可用
      【解决方案3】:

      这是你想要的吗?它返回 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)
                         );
      

      【讨论】:

      • 我必须对其进行测试,但这似乎正是我想要的
      • 好的,对于基本问题,我很抱歉,但我不知道实际用于 t 和 t2 的内容。表名称是“下载”。我用“下载”替换了所有“t”实例,但我不确定如何处理 t2。我尝试将其保留为 t2 但我得到 0 行。 SQL 并不是我的强项。我偶尔会使用它,但我主要是 C/C++ 开发人员,所以我从不做比基本 SELECT/INSERT 类型更多的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      相关资源
      最近更新 更多