1

SQLクエリの下に書くことに行き詰まっています。次のようなテーブルがあります。

id | C1 | C2 | date

1  | 1  | 1  | 1/10/2010 9:30:10
2  | 1  | 1  | 1/10/2010 9:31:10
3  | 1  | 1  | 1/10/2010 9:32:10
4  | 1  | 1  | 1/10/2010 9:37:10
5  | 1  | 2  | 1/10/2010 9:38:10
6  | 2  | 3  | 1/10/2010 9:39:10
7  | 2  | 3  | 1/10/2010 9:45:10
8  | 2  | 3  | 1/10/2010 9:46:10

今、私は次のようなレコードを取得したいと思います:
5 分の日付差 (最新の日付) と同じ C1 と同じ C2
(つまり、同じ C1 の各 C2 の 5 分以内の latset 日付のようなレコード) でレコードをグループ化します。
出力を次のようにします。

id | C1 | C2 | date

3  | 1  | 1  | 1/10/2010 9:32:10
4  | 1  | 1  | 1/10/2010 9:37:10
5  | 1  | 2  | 1/10/2010 9:38:10
6  | 2  | 3  | 1/10/2010 9:39:10
7  | 2  | 3  | 1/10/2010 9:46:10

説明:
1. 最初の 3 つのレコードがグループ化され (同じ C1 と同じ C2 が 5 分以内に)、3 番目のレコードが取得されます (これら 3 つのレコードのうち最新のもの)。
2. 4 番目のレコードが取得されます。(同じ C1 と同じ C2 の 5 分後方 & 5 分前方の唯一のレコードでした)。
3.上記と
同様に・・・8レコード目まで。
さまざまなグループ化クエリとパーティション化クエリを試しましたが、行き詰まりました。どんな助けでも大歓迎です。ありがとうございました

4

2 に答える 2

2

もっと簡単な解決策があるかもしれませんが、共通のテーブル式 を使用checktimesagainsttimesして、同じテーブルに対して結合された 1 つのレコードを前後にチェックしました。私のデータがtest3というテーブルにあった場合、これはデータをテーブルm2として見て、それ自体に結合して、その前のレコードをテーブルm1として、その後のレコードをテーブルm3として結合します。

m1、m2、および m3 の日付を比較し、前または次のレコードから 5 分以内であれば checktimesagainsttimes、列が 1 のテーブルを返します。WithinFiveMinutes

次に、別の一般的なテーブル式を使用してchecktimesagainsttimes、 を 2 回クエリします。5分以内にいるグループの最大日付を初めて取得します。次に、結果をchecktimesagainsttimes互いに 5 分以内にない結果に結合します。これらの結果は maxdatesforwithin5minutes に返されます。

最後に、これらの結果を取得し、c1、c2、および日付に基づいて元のテーブルに結合して、実際のrowed.

WITH    checktimesagainsttimes
          AS ( SELECT   m2.id AS id2 ,
                        m1.id AS id1 ,
                        m3.id AS id3 ,
                        m2.date ,
                        m2.c1 ,
                        m2.c2 ,
                        CASE WHEN ( DATEADD(mi, 5, m2.date) > m3.date
                                    AND m2.date < m3.date
                                  )
                                  OR ( DATEADD(mi, -5, m2.date) < m1.date
                                       AND m2.date > m1.date
                                     ) THEN 1
                             ELSE 0
                        END AS WithinFiveMinutes
               FROM     test3 m2
                        LEFT OUTER JOIN test3 m1 ON m2.c1 = m1.c1
                                                    AND m2.c2 = m1.c2
                                                    AND ( m2.id = m1.id
                                                          + 1 )
                        LEFT OUTER JOIN test3 m3 ON m2.c1 = m3.c1
                                                    AND m2.c2 = m3.c2
                                                    AND ( m2.id = m3.id
                                                          - 1 )
             ),
        maxdatesforwithin5minutes
          AS ( SELECT   c1 ,
                        c2 ,
                        MAX(date) AS date
               FROM     checktimesagainsttimes
               WHERE    WithinFiveMinutes = 1
               GROUP BY c1 ,
                        c2 ,
                        withinFiveMinutes
               UNION
               SELECT   c1 ,
                        c2 ,
                        date
               FROM     checktimesagainsttimes
               WHERE    WithinFiveMinutes = 0
             )
    SELECT  t.id ,
            t.c1 ,
            t.c2 ,
            t.date
    FROM    maxdatesforwithin5minutes m
            INNER JOIN test3 t ON m.c1 = t.c1
                                  AND m.c2 = t.c2
                                  AND m.date = t.date
于 2013-10-23T19:22:01.627 に答える