获取同一日期包含多个条目的记录列表

时间:2008-09-16 20:35:36

标签: sql

我需要从一个表中返回记录ID的列表,该表可能/可能没有在同一日期具有该记录ID的多个条目。相同的日期标准是关键 - 如果记录在09/10/2008有三个条目,那么我需要返回所有三个。如果记录在09/12/2008只有一个条目,那么我不需要它。

15 个答案:

答案 0 :(得分:3)

SELECT id, datefield, count(*) FROM tablename GROUP BY datefield
  HAVING count(*) > 1

答案 1 :(得分:2)

由于您提到需要所有三条记录,我假设您也想要数据。如果您只需要id,则只需按查询使用组即可。要返回数据,只需将其作为子查询加入

select * from table
inner join (
     select id, date
     from table 
     group by id, date 
     having count(*) > 1) grouped 
       on table.id = grouped.id and table.date = grouped.date

答案 2 :(得分:2)

最高职位(Leigh Caldwell)不会返回重复记录,需要进行修改。它将识别重复的密钥。此外,如果您的数据库不允许group by不包含所有选择字段(很多不包括),它将无法工作。

如果您的日期字段包含时间戳,那么您需要使用上面记录的方法之一截断它(我更喜欢:dateadd(dd,0,datediff(dd,0,@ DateTime)))。 / p>

我认为Scott Nichols给出了正确答案,这是一个证明它的脚本:

declare @duplicates table (
id int,
datestamp datetime,
ipsum varchar(200))

insert into @duplicates (id,datestamp,ipsum) values (1,'9/12/2008','ipsum primis in faucibus')
insert into @duplicates (id,datestamp,ipsum) values (1,'9/12/2008','Vivamus consectetuer. ')
insert into @duplicates (id,datestamp,ipsum) values (2,'9/12/2008','condimentum posuere, quam.')
insert into @duplicates (id,datestamp,ipsum) values (2,'9/13/2008','Donec eu sapien vel dui')
insert into @duplicates (id,datestamp,ipsum) values (3,'9/12/2008','In velit nulla, faucibus sed')

select a.* from @duplicates a
inner join (select id,datestamp, count(1) as number
              from @duplicates
          group by id,datestamp
            having count(1) > 1) b
       on (a.id = b.id and a.datestamp = b.datestamp)

答案 3 :(得分:2)

SELECT RecordID
FROM aTable
WHERE SameDate IN
    (SELECT SameDate
    FROM aTable
    GROUP BY SameDate
    HAVING COUNT(SameDate) > 1)

答案 4 :(得分:1)

GROUP BYHAVING

是你的朋友:

select id, count(*) from records group by date having count(*) > 1

答案 5 :(得分:1)

select id from tbl where date in
(select date from tbl group by date having count(*)>1)

答案 6 :(得分:1)

仅用于匹配日期时间的日期部分:

select * from Table
where id in (
    select alias1.id from Table alias1, Table alias2
    where alias1.id != alias2.id
        and datediff(day, alias1.date, alias2.date) = 0
)

我想。这是基于我的假设,你需要在同一天的月份和年份,但不是同一时间,所以我没有使用Group by子句。从其他帖子看起来我可以更巧妙地使用Having子句。你可以在约会表达中使用拥有或分组吗?

答案 7 :(得分:1)

如果我理解你的问题你可以做类似的事情:

select
     recordID
from
    tablewithrecords as a
    left join (
        select
          count(recordID) as recordcount
        from
          tblwithrecords
        where
          recorddate='9/10/08'
     ) as b on a.recordID=b.recordID
where
     b.recordcount>1

答案 8 :(得分:1)

http://www.sql-server-performance.com/articles/dba/delete_duplicates_p1.aspx会让你前进。另外,http://en.allexperts.com/q/MS-SQL-1450/2008/8/SQL-query-fetch-duplicate.htm

我通过搜索Google搜索“sql重复数据”找到了这些内容。你会发现这不是一个不寻常的问题。

答案 9 :(得分:1)

SELECT * FROM the_table WHERE ROW(record_id,date) IN 
  ( SELECT record_id, date FROM the_table 
    GROUP BY record_id, date WHERE COUNT(*) > 1 )

答案 10 :(得分:1)

我不确定我理解你的问题,但也许你想要这样的事情:

SELECT id, COUNT(*) AS same_date FROM foo GROUP BY id, date HAVING same_date = 3;

这只是从我的脑海中写出来的,没有以任何方式进行测试。阅读GROUP BY和HAVING部分here。如果这不是您的意思,请忽略此答案。

答案 11 :(得分:1)

请注意,如果您使用的是SQL DateTime字段,则需要进行一些额外的处理。如果你有额外的时间数据,那么你不能只是按原样使用该列。您必须将DateTime规范化为当天包含的所有记录的单个值。

在SQL Server中,这是一个小技巧:

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)

您将DateTime转换为float,它将Date表示为整数部分,将Time表示为传递的一天的分数。砍掉那个小数部分,然后把它转回DateTime,然后你就在那天开始时午夜。

答案 12 :(得分:1)

SELECT id, count(*)
INTO #tmp
FROM tablename
WHERE date = @date
GROUP BY id
HAVING count(*) > 1

SELECT *
FROM tablename t
WHERE EXISTS (SELECT 1 FROM #tmp WHERE id = t.id)

DROP TABLE tablename

答案 13 :(得分:1)

在不知道表的确切结构或您使用的数据库类型的情况下,很难回答。但是,如果您正在使用MS SQL,并且如果您有一个真实的日期/时间字段,该字段的时间与在同一日期输入的记录不同,则此类内容应该有效:

select record_id, 
       convert(varchar, date_created, 101) as log date, 
       count(distinct date_created) as num_of_entries
from record_log_table
group by convert(varchar, date_created, 101), record_id
having count(distinct date_created) > 1

希望这有帮助。

答案 14 :(得分:1)

TrickyNixon写道;

  

最高职位(Leigh Caldwell)不会返回重复记录,需要进行修改。

然而,问题不是要求重复记录。它询问同一日期的重复记录ID ...

GROUP-BY,HAVING对我来说似乎很好。我以前在生产中使用它。

需要注意的事项:

SELECT ... FROM ... GROUP BY ...有计数(*)> 1

在大多数数据库系统上,将在O(NlogN)时间内运行。这是一个很好的解决方案。 (选择为O(N),排序为O(NlogN),分组为O(N),具有O(N) - 更糟糕的情况。最佳情况,日期被索引并且排序操作更有效。)< / p>

从...中选择......,....其中a.data = b.date

只有白痴做笛卡尔联合。但是你在看O(N ^ 2)时间。对于某些数据库,这也会创建一个“临时”表。当你的桌子只有10行时,这一切都是微不足道的。但是当那张桌子长大的时候会受伤!

Ob链接:http://en.wikipedia.org/wiki/Join_(SQL)