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

时间:2010-09-12 15:27:02

标签: sql

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

alt text

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

列'id_from_other_table'来自INNER JOIN,上面有表

7 个答案:

答案 0 :(得分:10)

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

SELECT DISTINCT CAST(start_date AS DATE) FROM table;

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

答案 1 :(得分:7)

除日期外,您还需要其他任何信息吗?如果不是:

SELECT DISTINCT start_date FROM table;

答案 2 :(得分:4)

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

您能否澄清一下考虑日期重复的日期精确度 - 日,小时,分钟?

无论如何,你可能想要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')

答案 3 :(得分:2)

Select Distinct CAST(FLOOR( CAST(start_date AS FLOAT ) )AS DATETIME) from Table

答案 4 :(得分:1)

如果要在特定日期选择任意随机单行,则

SELECT * FROM table_name GROUP BY DAY(start_date)

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

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

答案 5 :(得分:1)

这里是您的查询的解决方案,只返回该表中每个日期的一行 这里的解决方案'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

答案 6 :(得分:0)

你必须转换" DateTime"到"日期"。然后,无论该日期的时间如何,您都可以更轻松地选择给定日期中的一个。