mysql で定期観測したデータから、変更があったレコードのみ選択したい


例えば、スタックオーバーフローの自分の信用度を定時観測していたとします。(今回やりたいことは、たぶん stackexchange の api
たたけば取得できそうですが、具体例として聞きたいので、 mysql の中で完結するような方法を探しています。)

そうすると、たとえば

[code]

    observed_at,reputation
    2017-11-1,1000
    2017-11-2,1000
    2017-11-3,1010
    2017-11-4,1010
    2017-11-5,1010
    2017-11-6,1045
    2017-11-7,1045
    2017-11-8,1045
    
[/code]

のようなデータが select できます。

この中から、 reputation に変化のあった最初のレコードたちを select したいと思いました。

[code]

    observed_at,reputation
    2017-11-1,1000
    2017-11-3,1010
    2017-11-6,1045
    
[/code]

### 質問

  * mysql で、観測日時・その値のレコード列があったときに、データ値が変化した最初の観測だけを select するようにはどうしたらよいでしょうか？

### 追記

  * 日付に漏れは、あっても対応できた方がうれしいです。何かしらの理由で定時観測が失敗する可能性があるので。。




個人的には、@suzukisさんのおっしゃる通り、プログラムでやるか、Postgresqlのような分析関数のあるDBでやるほうが素直かと思いますが、強引にやるとするなら、ユーザー変数を使ってrowidを採番すればできると思います。（２ステートメントになりますが・・・）

[code]

    set @rowid_l = 0, @rowid_r = 0;
    
    select l.observed_at, l.reputation
    from    (
        select *, @rowid_l := @rowid_l + 1 as rowid from Test order by observed_at
    ) as l
    left join (
        select *, @rowid_r := @rowid_r + 1 as rowid from Test order by observed_at
    ) as r
    on l.rowid = r.rowid + 1
    where r.rowid is null
        or l.reputation != r.reputation
    order by l.rowid
    ;
    
[/code]




日付が連続しているという前提であれば、

[code]

    SELECT * FROM table t1 JOIN t2 ON t1.observed_at - t2.observed_at,reputation WHERE t1.observed_at != t2.observed_at
    
[/code]

こんな感じで、日付-1した自分自身とJOINして検索すればで解決出来ます。

日付が連続していないと、各行ごとに「1つ前の行」を検索で見つけてあげる必要があります。ウィンドウ関数をサポートしていれば簡単なのですが、MySQLはサポートしてないので、相関サブクエリで代替することになります。具体的に動くSQL提示できないので、「MySQL
LAG」で検索すると解説が見つかります。

私ならややこしいSQLを保守するぐらいであれば

  * プログラムで全件取得して処理する
  * 日付が連続するよう補完する
  * PostgreSQLでやる

ことを検討します。

