SQL在特定日期选择重复项

Posted

技术标签:

【中文标题】SQL在特定日期选择重复项【英文标题】:SQL select duplicates on specific day 【发布时间】:2013-06-18 10:36:06 【问题描述】:

我正在尝试查找同一天出现的重复条目。我有一个数据库表,它基本上只包含 ID、USERNAME 和 DATE_CREATED。

我需要一个大致这样做的选择:

SELECT USERNAME,DATE_CREATED 
FROM THE_TABLE WHERE more than one USERNAME exists on date TRUNC(DATE_CREATED)

是否可以在不创建过程的情况下仅通过 SELECT 来完成?感谢您的建议。

【问题讨论】:

【参考方案1】:
SELECT  USERNAME, TRUNC(DATE_CREATED)
FROM    THE_TABLE
GROUP   BY
        USERNAME, TRUNC(DATE_CREATED)
HAVING  COUNT(*) > 1;

例子:

SELECT  USERNAME, TRUNC(DATE_CREATED)
FROM    
(
        SELECT  'a' username, sysdate date_created from dual union all
        SELECT  'a' username, sysdate date_created from dual union all
        SELECT  'b' username, sysdate date_created from dual union all
        SELECT  'b' username, sysdate date_created from dual
)
GROUP   BY
        USERNAME, TRUNC(DATE_CREATED)
HAVING  COUNT(*) > 1;
/*
a   2013-06-18 00:00:00
b   2013-06-18 00:00:00
*/

要在输出中获取完整日期,这有点复杂:

SELECT  DISTINCT
        username
,       date_created
FROM    the_table ot
WHERE   EXISTS
        (
            SELECT  1
            FROM    the_table it
            WHERE   TRUNC(ot.date_created) = TRUNC(it.date_created)
            AND     ot.username            = it.username
            GROUP   BY
                    USERNAME, TRUNC(DATE_CREATED)
            HAVING  COUNT(*) > 1
        )
;
/*
a   2013-06-18 12:48:40
b   2013-06-18 12:48:40
*/

表必须被访问两次 + 需要 DISTINCT 关键字。是的,性能可能会下降。

【讨论】:

是的,这几乎完全是我需要的,除了我需要输出中的完整日期,而不仅仅是截断的日期。你能编辑那一件事吗?谢谢! 看看 schurik 的回答,它看起来很不错,如果它更好,我不会感到惊讶。 是的,他的回答对我来说更清楚,但我真的很感谢你的努力。【参考方案2】:

这将在输出中返回完整的日期。

SELECT 
      USERNAME
    , DATE_CREATED 
FROM 
(
  SELECT 
       USERNAME
    ,  DATE_CREATED
    ,  COUNT( *) over ( PARTITION by USERNAME, TRUNC( DATE_CREATED, 'DD') ) cnt
  FROM THE_TABLE
)
WHERE cnt > 1
;

【讨论】:

好主意。我想你以前见过它。 :-)【参考方案3】:
SELECT USERNAME, trunc(DATE_CREATED)
FROM THE_TABLE 
group by Username,TRUNC(DATE_CREATED)
having count(1) > 1

【讨论】:

这不会输出整个日期。请参阅舒里克的回答。但是+1,因此我稍后指定;) 是的,为了获得整行,您必须使用子选择,如 the_slk 的另一个答案所示【参考方案4】:

使用Having

select USERNAME, DATE_CREATED 
from test
group by USERNAME, DATE_CREATED 
Having COUNT(1) > 1

【讨论】:

count(1) 没有 count(*) 的优势,而且是非标准语法

以上是关于SQL在特定日期选择重复项的主要内容,如果未能解决你的问题,请参考以下文章

选择查询以显示具有最大日期的重复项

如何选择特定日期是不是早于 X 年? - 快速 SQL

从日期中选择特定记录的 SQL 查询

SQL 如何选择最近的日期项

SQL选择所有日期范围都存在的特定列

如何在SQL Server中选择特定日期的行,忽略时间。