Sql 获取同一日期具有多个条目的记录列表

Sql 获取同一日期具有多个条目的记录列表,sql,Sql,我需要从一个表中返回一个记录id列表,该表可能/可能不具有多个在同一日期具有该记录id的条目。同一日期标准是关键-如果一条记录在2008年9月10日有三个条目,那么我需要所有三个条目都返回。如果记录在2008年12月9日只有一个条目,那么我不需要它。与have一起分组的是您的朋友: SELECT id, datefield, count(*) FROM tablename GROUP BY datefield HAVING count(*) > 1 select id, count(

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

与have一起分组的是您的朋友:

SELECT id, datefield, count(*) FROM tablename GROUP BY datefield
  HAVING count(*) > 1
select id, count(*) from records group by date having count(*) > 1

要仅匹配Datetime的日期部分,请执行以下操作:

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
)

我想。这是基于我的假设,即您需要它们的日期、月份和年份相同,但不是一天中的同一时间,因此我没有使用GROUPBY子句。从其他帖子来看,我本可以更巧妙地使用Having子句。您能否在datediff表达式上使用having或group by?

如果我正确理解您的问题,您可以执行类似的操作:

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
我会让你走的。而且


我通过在谷歌搜索“sql重复数据”找到了这些。您会发现这不是一个不寻常的问题。

既然您提到需要所有三条记录,我想您也需要这些数据。如果您只需要id,您可以使用GROUPBY查询。要返回数据,只需将其作为子查询连接

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 )
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

我不确定我是否理解你的问题,但也许你想要这样的东西:

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

这只是我的想法,没有任何方式测试。阅读本组的内容,并阅读本节内容。如果这不是您的意思,请忽略此答案。

请注意,如果您使用的是SQL DateTime字段,则需要进行一些额外的处理。如果你在那里有额外的时间数据,那么你就不能按原样使用这个列。对于一天中包含的所有记录,必须将DateTime标准化为单个值

在SQL Server中,有一个小技巧可以做到这一点:

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

将日期时间强制转换为浮点数,浮点数将日期表示为整数部分,时间表示为一天过去的分数。切掉小数部分,然后将其转换回日期时间,一天的开始就是午夜。

如果不知道表的确切结构或使用的数据库类型,很难回答。但是,如果您使用的是MS SQL,并且如果您有一个“真实日期/时间”字段,该字段具有在同一日期输入记录的不同时间,则类似于这样的内容应该可以工作:

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

希望这能有所帮助。

Leigh Caldwell的顶级帖子不会返回重复记录,需要修改。它将识别重复的钥匙。此外,如果您的数据库不允许group by不包括所有select字段(许多字段不包括这些字段),那么它将不起作用

如果您的日期字段包含一个时间戳,那么您需要使用上面记录的方法之一截断它。我更喜欢:dateadddd,0,datediffdd,0,@DateTime

我认为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)
特里基尼克松写道


考德威尔(Leigh Caldwell)将不会返回重复记录,需要向下修改

然而,问题并不在于重复记录。它询问同一日期的重复记录ID

在我看来,这是一个很好的团体。我以前在生产中使用过它

需要注意的事项:

选择。。。从…起分组方式。。。计数*>1的

将在大多数数据库系统上以ONlogN时间运行。这是一个很好的解决办法。Select打开,sort打开,group by打开,having打开-情况更糟。最好的情况是,对日期进行索引,排序操作更有效

选择。。。从…起其中a.data=b.date

当然,只有傻瓜才会做笛卡尔连接。但你现在看到的是^2次。对于某些数据库,这还会创建一个临时表。当您的表只有10行时,这一切都无关紧要。但那张桌子长起来会痛的


Ob link:

这将返回所有日期与其他记录共享的记录。我想他只想要那些有多个条目且日期相同的记录。对于这类问题,最好指定RDBMS。Oracle可以使用SQL Server无法使用的解决方案,反之亦然。
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)
SELECT RecordID
FROM aTable
WHERE SameDate IN
    (SELECT SameDate
    FROM aTable
    GROUP BY SameDate
    HAVING COUNT(SameDate) > 1)