【问题标题】:Need to find duplicates with multiple criteria and then comparing dates between duplicates需要查找具有多个条件的重复项,然后比较重复项之间的日期
【发布时间】:2015-11-28 16:13:59
【问题描述】:

我正在将年度会员注册信息写入单个数据库表。我需要跟踪自上次续订后不到 11 个月内发生续订的时间。

我根据多个条件查找重复的行。我目前有这个工作没有 11 个月的标准,虽然它很慢。这是我目前使用的。

    SELECT y_reg.* FROM y_reg WHERE (((y_reg.season) In (SELECT season FROM y_reg As Tmp 
    GROUP BY season, Father_Last_Name, Father_First_Name 
    HAVING Count(*)>1  
    AND Father_Last_Name = y_reg.Father_Last_Name 
    AND Father_First_Name = y_reg.Father_First_Name))) 
    ORDER BY y_reg.season, y_reg.Father_Last_Name, y_reg.Father_First_Name

我有一个字段Date,这是我需要评估的续订日期。我想添加类似“AND Date - Date 335是天数,比一年少了大约1个月。但我只是不断收到语法错误,因为我显然不知道自己在做什么。

【问题讨论】:

  • 我需要在输出中显示所有重复的行。似乎添加任何类型的 AND b.Date = a.Date - 12 MONTH 会导致不返回原始行。有没有办法使用日期不同的标准而不过滤输出中的匹配重复项?
  • 我无法在这篇文章中找到解决方案。但是我在这里找到了一个解决方案:[link]stackoverflow.com/questions/32414978/…

标签: mysql duplicates


【解决方案1】:

Date arithmetic 在 MySQL 中运行良好;你只需要诀窍。

你可以这样说

    AND later.Date >= earlier.Date
    AND later.Date < earlier.Date + INTERVAL 11 MONTH

如果较晚的日期发生在较早的日期和 11 个月后的时间范围内,则该特定的比较对成立。

一般来说,你可以这样说来做日期算术。

   datestamp + INTERVAL 1 HOUR
   datestamp - INTERVAL 5 MINUTE
   datestamp + 1 MONTH - 3 WEEK
   datestamp - INTERVAL 3 QUARTER  (calendar quarters)
   LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 1 MONTH

最后一项是包含日期戳的月份的第一天。这整个约会的事情效果很好。

我认为您应该考虑使用所谓的self-join 查询来获取重复日期除外结果。尝试这样的事情。

 SELECT a.* 
   FROM y_reg a
   JOIN y_reg b   ON a.Father_Last_Name = b.Father_Last_Name
                 AND a.Father_First_Name = b.Father_First_Name
                 AND b.Date <  a.Date - 11 MONTH
                 AND b.Date >= a.Date - 12 MONTH

【讨论】:

  • 谢谢。与我原来的选择相比,新选择的速度更快。似乎返回单个记录可能是因为 a & b 具有相同的记录。我只需要在匹配计数大于一时显示它们。然后按最后,第一个顺序。 WHERE Count(*) >1 GROUP BY Father_Last_Name, Father_First_Name 但是由于未正确使用组和计数而出现语法错误。
  • 我已经到了这一点,没有语法错误 SELECT early.* FROM y_reg early JOIN y_reg later ON early.Father_Last_Name = later.Father_Last_Name AND early.Father_First_Name = later.Father_First_Name AND later.Date = early.Date - INTERVAL 12 MONTH GROUP BY Father_Last_Name, Father_First_Name HAVING Count(*) >1 ORDER BY early.Year, early.Father_Last_Name, early.Father_First_Name 仍然只返回单行没有它的 dup 根本就不会返回,而不是像原来那样两个或多个 dup 彼此相邻。
  • 我仍然坚持这个。我只返回一行重复项。我需要它们全部显示,以便用户可以决定删除哪一个。
猜你喜欢
  • 2020-03-09
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多