简体   繁体   English

SQL在特定日期选择重复项

[英]SQL select duplicates on specific day

I'm trying to find duplicate entries which occurred on the same day. 我试图在同一天找到重复的条目。 I have a database table which basically consists only from ID, USERNAME and DATE_CREATED. 我有一个数据库表,它基本上只包含ID,USERNAME和DATE_CREATED。

I need a select which does roughly this: 我需要一个大致如此的选择:

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

Is it possible to do it without creating a procedure only by SELECT? 是否可以在不通过SELECT创建过程的情况下执行此操作? Thanks for advice. 谢谢你的建议。

SELECT  USERNAME, TRUNC(DATE_CREATED)
FROM    THE_TABLE
GROUP   BY
        USERNAME, TRUNC(DATE_CREATED)
HAVING  COUNT(*) > 1;

Example: 例:

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
*/

To get the full date in the output it is slightly complicated: 要在输出中获取完整日期,这有点复杂:

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
*/

Table has to be accessed twice + DISTINCT keyword is required. 表必须访问两次+ DISTINCT关键字是必需的。 Yes, the performance can decrease. 是的,性能会降低。

This will return the full date in the output. 这将返回输出中的完整日期。

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
;
SELECT USERNAME, trunc(DATE_CREATED)
FROM THE_TABLE 
group by Username,TRUNC(DATE_CREATED)
having count(1) > 1

Use Having 使用

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM