SQL Server - 用于查找具有不同日期的重复记录的SQL查询

时间:2018-04-24 12:28:37

标签: sql sql-server duplicates analytics datediff

我需要查找具有不同日期的重复记录(ID),但副本必须在之前/之后原始日期。基本上我试图找出是否在不同的日子使用相同的ID。

我能够找到重复但却无法获得日期部分,是否有更简单的方法来执行上述操作?

我一直在尝试以下方法但觉得我过于复杂化了:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<com.google.android.gms.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</com.google.android.gms.maps.MapView>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <android.support.v7.widget.RecyclerView
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:id="@+id/item_picker">

    </android.support.v7.widget.RecyclerView>
</RelativeLayout>
</RelativeLayout>

我的数据类似于:

SELECT *  
FROM table
WHERE ID IN (
    SELECT ID
    FROM Table
    Where [DATE] < DATEADD(day, +1, [DATE]) and ID=ID
    GROUP BY ID
    HAVING COUNT(*) > 1 )
    ORDER BY Name,[DATE], ID ASC

查询应该只选择名称AB和DE。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

SELECT NAME,
       DATE,
       ID
FROM TABLE1
WHERE ID IN (SELECT ID
             FROM TABLE1
             GROUP BY ID
             HAVING COUNT(*) > 1)

<强>输出

NAME    DATE    ID
A   2018-03-30  6.26
B   2018-03-31  6.26
D   2018-04-02  11.88
E   2018-04-03  11.88

<强>演示

  

http://sqlfiddle.com/#!18/15edb/1

答案 1 :(得分:0)

您可以使用exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.id = t.id and
                    t2.date = dateadd(day, -1, t1.date)
             );

选择后面的副本。对于较早的版本,请使用1代替-1

答案 2 :(得分:0)

您可以尝试以下方法

DECLARE @T TABLE
(
    Nm VARCHAR(50),
    Mydate DATE,
    Id FLOAT
)

INSERT INTO @T
VALUES('A','3/30/2018',6.26),
('B','3/31/2018',6.26),
('C','4/1/2018',7.85),
('D','4/2/2018',11.88),
('E','4/3/2018',11.88),
('F','4/4/2018',9.48)

SELECT
    *
    FROM @T T
       WHERE EXISTS
       (
          SELECT 1 FROM @T WHERE ID = T.Id GROUP BY Id HAVING COUNT(1)>1
       )