0

ABだけを見たいこのテーブルがあります

ID     CODE       COUNT   
102    AB         9
101    AB         8
100    AC         23    //not important!!!!
99     AB         7
98     AB         6
97     AB         5
96     AB         0

次に、CODE'AB'を持つ特定のID間の違いを数えたいと思います

それで

Step 1: 9 - 8 = 1   // (corrected sample data. this line was wrong)
Step 2: 8 - 7 = 1
Step 3: 7 - 6 = 1
Step 4: 6 - 5 = 1
Step 5: 5 - 0 = 5

これは、@bonCodigoによって作成されたこのクエリによって実行されます

select ID, DIFFERENCE, 
COUNT from (
    SELECT
    t.ID, t.CODE, t.COUNT,
    @PREVCOUNT,
    @PREVCOUNT - t.COUNT DIFFERENCE,
    @PREVCOUNT := t.COUNT  -- Updates for the next iteration, so it
                           -- must come last!
    FROM
    (SELECT ID, CODE, COUNT FROM some_table WHERE CODE = 'AB' ORDER BY ID DESC) t,
    (SELECT @PREVCOUNT := NULL) _uv
    group by t.id, t.code
    )x
where x.difference >= 0
order by ID DESC;

私の新しい着信データは時々カウントをリセットするので、0から何までもカウントを開始します。

したがって、データを次の順序で取得することがあります。

ID        COUNT
1.        0
2.        1
3.        2
4.        7
5.        4     // which means the counter has reset to 0 and counted up to 4 again.
6.        5

今私のクエリが行っていることは、ポジティブな変化だけを数え、これを違いとしてとらえます。

だからそれは何をするのか:

Step 1: 1 - 0 = 1
Step 2: 2 - 1 = 1
Step 3: 7 - 2 = 5
Step 4: 4 - 7 = -3 //discarded as this difference is smaller than 0
Step 5: 5 - 4 = 1

したがって、これをSUM()すると、8http://sqlfiddle.com/#!2/6924a/2になります

負の差があるとすぐにこのコードを0からカウントしたいのですが

だから私が欲しいもの:

Step 1: 1 - 0 = 1
Step 2: 2 - 1 = 1
Step 3: 7 - 2 = 5
Step 4: 4 - 7 = -3  BUT MAKE IT 4 because the counter started from 0 again.
Step 5: 5 - 4 = 1

したがって、これをSUM()すると、12になります。

4

1 に答える 1

1

IFステートメントでうまくいきます。

IF((@PREVCOUNT - t.COUNT) < 0, @PREVCOUNT, (@PREVCOUNT - t.COUNT)) DIFFERENCE

これがワーキングフィドルです:http ://sqlfiddle.com/#!2/6924a/7/0

そして、変更されたクエリは次のとおりです。

select ID, DIFFERENCE, 
COUNT from (
    SELECT
    t.ID, t.CODE, t.COUNT,
    @PREVCOUNT,
    IF((@PREVCOUNT - t.COUNT) < 0, @PREVCOUNT, (@PREVCOUNT - t.COUNT)) DIFFERENCE,
    @PREVCOUNT := t.COUNT  -- Updates for the next iteration, so it
                           -- must come last!
    FROM
    (SELECT ID, CODE, COUNT FROM some_table WHERE CODE = 'AB' ORDER BY ID DESC) t,
    (SELECT @PREVCOUNT := NULL) _uv
    group by t.id, t.code
    )x
where x.difference >= 0
order by ID DESC;
于 2013-01-28T17:29:08.977 に答える