在if检查后在Select语句中查找重复项

时间:2012-11-16 16:34:50

标签: sql tsql select group-by

我正在开展一个跟踪已修复手机的项目。

在select语句中,我想找到重复的IMEI号码,并检查重复项之间的AddedDate是否少于30天。换句话说,如果AddedDate超过30天,则select应列出所有手机,甚至包括重复的IMEI号码。

我希望我说得够清楚。谢谢。

附加说明:

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

例如,DB_Phones具有以下行

ID - AddedDate - IMEI

1 - 01.10.2012 - 123456789012345

2 - 15.10.2012 - 987654321012345

3 - 20.10.2012 - 123456789012345

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

ID - AddedDate - IMEI

1 - 01.10.2012 - 123456789012345

2 - 15.10.2012 - 987654321012345

3 - 20.10.2012 - 123456789012345

4 - 21.11.2012 - 123456789012345

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

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

1 个答案:

答案 0 :(得分: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字段以及一个表中存在的所有内容。使用相关的子查询,在长数据上可能不会很快。