0

我正在做一个跟踪维修过的手机的项目。

在 select 语句中,我想查找重复的 IMEI 号码并检查重复项之间的 AdditionalDate 是否小于 30 天。换句话说,如果 AdditionalDate 超过 30 天,选择应该列出所有电话,甚至包括重复的 IMEI 号码。

我希望我描述得足够清楚。谢谢你。

补充说明:

我已经通过在确实找到重复项的子选择下包含 groupBy 来尝试它,但是我无法实现 if 条件。相反,我打算将所有重复项放入一个动态表中,然后对该表使用 select 语句。在这样做之前,我想在这里发布我的问题。

例如 DB_Phones 有以下行

ID - 添加日期 - IMEI

1 - 01.10.2012 - 123456789012345

2 - 15.10.2012 - 987654321012345

3 - 2012 年 10 月 20 日 - 123456789012345

根据上表,我只想列出第二行(ID#2),因为最后一个副本(ID#3)没有在 ID#1 的行后 30 天添加。如果行如下:

ID - 添加日期 - IMEI

1 - 01.10.2012 - 123456789012345

2 - 15.10.2012 - 987654321012345

3 - 2012 年 10 月 20 日 - 123456789012345

4 - 21.11.2012 - 123456789012345

然后应该返回第二行和第四行。如果满足 30 天的条件,我只需要返回一个副本(最后一个)。

我希望它现在更有意义。再次感谢。

4

1 回答 1

0

猜猜你在追求什么:

SELECT
  r.*,
  (SELECT COUNT(*) FROM Repairs r2 WHERE r.IMEI = r2.IMEI
  AND r.ID != r2.ID) as NumberOfAllDuplicates,
  (SELECT COUNT(*) FROM Repairs r2 WHERE r.IMEI = r2.IMEI
  AND ABS(DATEDIFF(day, r.AddedDate, r2.AddedDate)) < 30
  AND r.ID != r2.ID) as NumberOfNearDuplicates
FROM
  Repairs r

这取决于有一个 ID 字段,以及一个表中存在的所有内容。使用相关的子查询,在长数据上可能不是很快。

于 2012-11-16T16:51:12.233 回答