0

クエリに問題があります。

これはデータです(タイムスタンプ順):

Data
    ID  Value   Timestamp
    1   0       2001-1-1
    2   0       2002-1-1
    3   1       2003-1-1
    4   1       2004-1-1
    5   0       2005-1-1
    6   2       2006-1-1
    7   2       2007-1-1
    8   2       2008-1-1

個別の値と日付の最初の出現を抽出する必要があります。ここでの例外は、その時間枠内に新しい値で中断されない場合にのみ、それらをグループ化する必要があることです。したがって、必要なデータは次のとおりです。

ID  Value   Timestamp
1   0       2001-1-1
3   1       2003-1-1
5   0       2005-1-1
6   2       2006-1-1

私は複雑なクエリでこれを機能させましたが、もっと簡単な方法があると確信しています。誰でも助けてもらえますか?

これは私が始めたものです - おそらくそれでうまくいくでしょう。これは、値が変更されたときに検索するクエリです。

  > SELECT * FROM Data d1 join Data d2 ON d1.Timestamp < d2.Timestamp and
    > d1.Value <> d2.Value

おそらく、row_number 句をうまく使用して実行できますが、管理できません。

4

1 に答える 1

0

サンプルデータ:

declare @T table (ID int, Value int, Timestamp date)
insert into @T(ID,  Value,   Timestamp) values
(1,   0,       '20010101'),
(2,   0,       '20020101'),
(3,   1,       '20030101'),
(4,   1,       '20040101'),
(5,   0,       '20050101'),
(6,   2,       '20060101'),
(7,   2,       '20070101'),
(8,   2,       '20080101')

クエリ:

;With OrderedValues as (
    select *,ROW_NUMBER() OVER (ORDER By TimeStamp) as rn --TODO - specific columns better than *
    from @T
), Firsts as (
    select
        ov1.* --TODO - specific columns better than *
    from
        OrderedValues ov1
            left join
        OrderedValues ov2
            on
                ov1.Value = ov2.Value and
                ov1.rn = ov2.rn + 1
    where
        ov2.ID is null
)
select * --TODO - specific columns better than *
from Firsts

ID値が連続しており、ギャップがないことに依存しませんでした。その場合は省略できます( andの代わりにOrderedValuestable and を使用) 。2 番目のクエリは、同じ を持つ直前の行がない行を単純に検索します。IDOrderedValuesrnValue

結果:

ID          Value       Timestamp  rn
----------- ----------- ---------- --------------------
1           0           2001-01-01 1
3           1           2003-01-01 3
5           0           2005-01-01 5
6           2           2006-01-01 6

rnこの特定の順序で結果が必要な場合は、並べ替えることができます。

于 2012-09-27T09:43:16.760 に答える