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

时间:2020-03-05 18:57:07  来源:igfitidea点击:

我需要从一个表中返回记录ID的列表,该表可能/可能没有在同一日期具有该记录ID的多个条目。如果记录在2008年9月10日有3个条目,则相同的日期条件是关键,那么我需要将所有3个条目都返回。如果该记录在2008年9月12日只有一个条目,那么我就不需要它。

解决方案

回答

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

回答

朋友中带有" HAVING"的" GROUP BY"是朋友:

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

回答

select id from tbl where date in
(select date from tbl 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
)

我认为。这是基于我的假设,即我们在月份和年份的同一天而不是一天中的同一时间需要它们,因此我没有使用Group by子句。从其他帖子看来,我可以更巧妙地使用Haveing子句。我们可以在datediff表达式上使用hading或者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

回答

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重复数据"找到了这些。我们会看到这不是一个罕见的问题。

回答

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 )

回答

由于我们提到需要全部三个记录,因此我假设我们也需要这些数据。如果只需要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

回答

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

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

这只是我写的,没有经过任何测试。在此处阅读GROUP BY和HAVING部分。如果这不是意思,请忽略此答案。

回答

请注意,如果我们使用的是SQL DateTime字段,则需要进行一些额外的处理。如果我们那里有多余的时间数据,则不能按原样使用该列。我们必须将日期中包含的所有记录的DateTime标准化为单个值。

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

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

我们将DateTime转换为一个浮点数,该浮点数将Date表示为整数部分,并将Time表示为经过的一天的一部分。切掉该小数部分,然后将其强制转换回DateTime,那一天的开始就是午夜。

回答

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

回答

如果不知道表的确切结构或者所使用的数据库类型,将很难回答。但是,如果我们使用的是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

希望这可以帮助。

回答

最高职位(Leigh Caldwell)将不会返回重复的记录,因此需要进行修改。它将标识重复的密钥。此外,如果数据库不允许分组依据不包括所有选择字段(很多不允许),则该方法将不起作用。

如果日期字段包含时间戳,则需要使用上面记录的方法之一将其截断(我更喜欢:dateadd(dd,0,datediff(dd,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)

回答

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

回答

TrickyNixon写道;

The top post (Leigh Caldwell) will not return duplicate records and needs to be down modded.

但是问题并没有询问重复记录。它询问有关同一日期的重复记录ID。

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

需要注意的事情:

SELECT ... FROM ... GROUP BY ... HAVING count(*)> 1

在大多数数据库系统上,将以O(NlogN)时间运行。这是一个很好的解决方案。 (选择是O(N),排序是O(NlogN),分组依据是O(N),具有O(N)-更糟的情况。最好的情况是,对日期进行索引,并且排序操作效率更高。)

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

仅允许白痴进行笛卡尔加入。但是我们正在查看O(N ^ 2)时间。对于某些数据库,这还会创建一个"临时"表。当表只有10行时,这些都是无关紧要的。但是那张桌子长大会很疼的!

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