2

次の構造のテーブルがあります

ID  Person  LOG_TIME
-----------------------------------
1   1       2012-05-21 13:03:11.550
2   1       2012-05-22 13:09:37.050 <--- this is duplicate
3   1       2012-05-28 13:09:37.183
4   2       2012-05-20 15:09:37.230
5   2       2012-05-22 13:03:11.990 <--- this is duplicate
6   2       2012-05-24 04:04:13.222 <--- this is duplicate
7   2       2012-05-29 11:09:37.240

このテーブルにデータを入力するアプリケーション ジョブがあります。

各人は 7 日ごとに 1 つのレコードのみを持つべきであるというビジネス ルールがあります。

上記の例から、レコード # 2、5、および 6 は重複と見なされますが、1、3、4、および 7 は問題ありません。

7 日以内に同じ人のレコードがあるかどうかを確認する SQL クエリが必要です。

4

4 に答える 4

1
;WITH cte AS
 (
  SELECT ID, Person, LOG_TIME,
         DATEDIFF(d, MIN(LOG_TIME) OVER (PARTITION BY Person), LOG_TIME) AS diff_date
  FROM dbo.Log_time
  )
SELECT *
FROM cte
WHERE diff_date BETWEEN 1 AND 6

SQLFiddle のデモ

于 2012-12-09T22:05:48.667 に答える
1

ここで SQLFiddle に関する私の試みを参照してください。

に基づく結合を使用して、DATEDIFF()ログに記録された間隔が 7 日未満のレコードを見つけることができます。

WITH TooClose
AS
(
    SELECT
        a.ID AS BeforeID,
        b.ID AS AfterID
    FROM
        Log a
        INNER JOIN Log b ON a.Person = b.Person
                        AND a.LOG_TIME < b.LOG_TIME
                        AND DATEDIFF(DAY, a.LOG_TIME, b.LOG_TIME) < 7
)

ただし、これには「重複」と見なされないレコードが含まれます (たとえば、ID 2 に近すぎるため、ID 3 など)。あなたが言ったことから、レコードが近すぎるレコード自体が「重複」である場合、そのレコードは「重複」ではないと推測しています。

したがって、このルールを適用して重複の最終的なリストを取得するには:

SELECT
    AfterID AS ID
FROM
    TooClose
WHERE
    BeforeID NOT IN (SELECT AfterID FROM TooClose)
于 2012-12-08T17:18:56.720 に答える
0

こちらのサンプルをご覧ください。

参考:SQLFIDDLE

クエリ:

select person, 
datediff(max(log_time),min(log_time)) as diff,
count(log_time)
 from pers 
 group by person
;

select y.person, y.ct
from (
select person, 
datediff(max(log_time),min(log_time)) as diff,
count(log_time) as ct
 from pers 
 group by person) as y
where y.ct > 1
and y.diff <= 7
;


PERSON  DIFF    COUNT(LOG_TIME)
1   1   3
2   8   3


PERSON  CT
1   3
于 2012-12-08T15:22:09.747 に答える