代码之家  ›  专栏  ›  技术社区  ›  Tony

SQL如何删除select查询中的重复项?

sql
  •  11
  • Tony  · 技术社区  · 16 年前

    我有一张像这样的桌子:

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

    列“id_from_other_table”来自与上表的内部联接

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

    列'id_from_other_table'来自与上表的内部联接

    7 回复  |  直到 9 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    您提到有重复的日期,但看起来它们在精确到秒的范围内是非常独特的。

    你能解释一下你开始考虑日期重复的精确性吗-天,小时,分钟?

    无论如何,你可能会想 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')
    
        2
  •  10
  •   Thomas Mueller    16 年前

    同一日期有多行,但时间不同。因此,不同的开始日期将不起作用。您需要的是:将开始日期强制转换为日期(这样时间部分就不存在了),然后执行不同的操作:

    SELECT DISTINCT CAST(start_date AS DATE) FROM table;
    

    根据所使用的数据库,日期的类型名称不同。

        3
  •  7
  •   amorfis    16 年前

    除了日期你还需要其他信息吗?如果不是:

    SELECT DISTINCT start_date FROM table;
    
        4
  •  1
  •   ADB    14 年前
    Select Distinct CAST(FLOOR( CAST(start_date AS FLOAT ) )AS DATETIME) from Table
    
        5
  •  1
  •   zessx    11 年前

    下面是查询的解决方案,该表中的每个日期只返回一行 在解决方案中,“托尼”会出现两次,因为它有两个不同的开始日期。

    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
    
        6
  •  0
  •   Akshay    13 年前

    如果要为特定日期选择任意一行,则

    SELECT * FROM table_name GROUP BY DAY(start_date)
    

    如果要每天为每个用户选择一个条目,则

    SELECT * FROM table_name GROUP BY DAY(start_date),owner_name
    
        7
  •  0
  •   M T Head    9 年前

    您必须将“日期时间”转换为“日期”。然后,您可以更容易地为给定日期选择一个,而不管该日期是什么时间。