sql >> データベース >  >> RDS >> Sqlserver

列の値が変更された行を選択します

    これがあなたが求めているものだと思います:

    ;WITH x AS
    (
      SELECT value, time, rn = ROW_NUMBER() OVER 
      (PARTITION BY Value ORDER BY Time)
      FROM dbo.table
    )
    SELECT * FROM x WHERE rn = 1;
    

    結果セットが大きく、適切なサポートインデックスがない場合、これは遅くなる可能性があります...

    編集

    ああ、ちょっと待ってください。値は上がるだけでなく、上下します...その場合は、このはるかに遅いアプローチを試すことができます:

    DECLARE @x TABLE(value INT, [time] DATETIME)
    
    INSERT @x VALUES
    (0,'20120615 8:03:43 PM'),--
    (1,'20120615 8:03:43 PM'),--*
    (1,'20120615 8:03:48 PM'),--
    (1,'20120615 8:03:53 PM'),--
    (1,'20120615 8:03:58 PM'),--
    (2,'20120615 8:04:03 PM'),--*
    (2,'20120615 8:04:08 PM'),--
    (3,'20120615 8:04:13 PM'),--*
    (3,'20120615 8:04:18 PM'),--
    (3,'20120615 8:04:23 PM'),--
    (2,'20120615 8:04:28 PM'),--*
    (2,'20120615 8:04:33 PM');
    
    ;WITH x AS
    (
      SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time)
      FROM @x
    )
    SELECT x.value, x.[time]
    FROM x LEFT OUTER JOIN x AS y
    ON x.rn = y.rn + 1
    AND x.value <> y.value
    WHERE y.value IS NOT NULL;
    

    結果:

    value  time
    -----  -----------------------
    1      2012-06-15 20:03:43.000
    2      2012-06-15 20:04:03.000
    3      2012-06-15 20:04:13.000
    2      2012-06-15 20:04:28.000
    


    1. Python3を使用したJupyterNotebookを介したMySQLデータベースへのアクセス

    2. &のような特殊文字をOracleデータベースに入力する方法は?

    3. 失敗した挿入でMySQLの自動インクリメントが増加するのはなぜですか?

    4. MySQLでシリアル化データを更新する方法