【问题标题】:SQL How to remove duplicates within select query?SQL如何删除选择查询中的重复项?
【发布时间】:2017-07-12 09:01:56
【问题描述】:

我有一张看起来像这样的桌子:

如您所见,有一些日期重复,那么如何为该表中的每个日期只选择一行?

“id_from_other_table”列来自与上表的 INNER JOIN

【问题讨论】:

  • 什么数据库,什么版本?
  • 您好 Tony,当我尝试做类似的事情时,我发现这很有用。它不会回答您的问题并删除重复项,但它有助于提供可能相关的计数:COUNT(*) - COUNT(DISTINCT name) AS 'duplicate name'

标签: sql


【解决方案1】:

有多行日期相同,但时间不同。因此,DISTINCT start_date 将不起作用。您需要的是:将 start_date 转换为 DATE(因此 TIME 部分消失了),然后执行 DISTINCT:

SELECT DISTINCT CAST(start_date AS DATE) FROM table;

根据您使用的数据库,DATE 的类型名称不同。

【讨论】:

    【解决方案2】:

    除了日期之外,您还需要其他信息吗?如果没有:

    SELECT DISTINCT start_date FROM table;
    

    【讨论】:

    • 日期相同,但时间不同;因此,DISTINCT 在没有一些格式的情况下无法在 start_date 上工作
    【解决方案3】:

    你提到有重复的日期,但看起来它们非常独特,精确到秒。

    你能澄清一下你开始考虑日期重复的日期精度 - 天、小时、分钟吗?

    无论如何,您可能想要floor your datetime field。您在删除重复项时没有指明首选哪个字段,因此此查询将首选按字母顺序排列的姓氏。

     SELECT MAX(owner_name), 
            --floored to the second
            dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') AS StartDate
     From   MyTable
     GROUP BY dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01')
    

    【讨论】:

    • 我考虑年、月、日和 hh:mm:ss
    【解决方案4】:
    Select Distinct CAST(FLOOR( CAST(start_date AS FLOAT ) )AS DATETIME) from Table
    

    【讨论】:

      【解决方案5】:

      这是您的查询的解决方案,该查询只为该表中的每个日期返回一行 在解决方案中,“tony”将出现两次,因为它有两个不同的开始日期

      SELECT * FROM 
      (
          SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY TRUNC(START_DATE),OWNER_NAME ORDER BY 1,2 DESC )  RNM
          FROM TABLE T1
      )
      WHERE RNM=1
      

      【讨论】:

      • 嗨@zessx你是如何编辑它的,我把格式化的代码和你编辑的一样,但是在发布后,它并没有像现在这样出现,你是怎么做的???
      • 粘贴格式化代码是不够的(事实上,它什么也没做)。您需要粘贴代码,选择它并使用 Ctrl+K(或单击 StackOverflow 编辑器中的 {} 按钮)。您也可以手动执行,在每行代码前添加 4 个空格。
      【解决方案6】:

      如果您想为特定日期选择任何随机单行,那么

      SELECT * FROM table_name GROUP BY DAY(start_date)
      

      如果你想每天为每个用户选择一个条目,那么

      SELECT * FROM table_name GROUP BY DAY(start_date),owner_name
      

      【讨论】:

        【解决方案7】:

        您必须将“日期时间”转换为“日期”。然后,无论该日期的时间如何,您都可以更轻松地为给定日期选择一个。

        【讨论】:

          猜你喜欢
          • 2022-12-22
          • 1970-01-01
          • 2019-12-11
          • 2017-07-11
          • 2017-09-16
          • 2014-07-03
          • 2014-09-23
          • 2019-08-19
          • 2016-09-03
          相关资源
          最近更新 更多