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在特定日期选择重复项的主要内容,如果未能解决你的问题,请参考以下文章