3

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

これに話しかけた

ID    NEWID     CODE       COUNT   
102   102       AB         9
101   101       AB         8
99    100       AB         7
98    99        AB         6
97    98        AB         5
96    97        AB         0

使用する

SELECT
t.ID, t.CODE, t.COUNT,
@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;

http://sqlfiddle.com/#!2/e0b8b/36/0

そう

Step 1: 9 - 1 = 1
Step 2: 8 - 7 = 1
Step 3: 7 - 6 = 1
Step 4: 6 - 5 = 1
Step 5: 5 - 0 = 5

今、私が持っている場合があるかもしれません

ID    NEWID     CODE       COUNT   
102   102       AB         4
101   101       AB         2
99    100       AB         1
98    99        AB         0
97    98        AB         7
96    97        AB         0

じゃあ数えたい

Step 1: 4 - 2 = 2
Step 2: 2 - 1 = 1
Step 3: 1 - 0 = 1
Step 4: 0 - 7 = -7      //want  to discard this negative value
Step 5: 5 - 0 = 7

これは否定的であるため、ステップ 4 を破棄します。

今、このコードを使用して負の値を破棄します

SELECT
t.ID, t.CODE, t.COUNT,
@PREVCOUNT,
@PREVCOUNT - t.COUNT DIFFERENCE,
CASE @PREVCOUNT - t.COUNT WHEN @PREVCOUNT - t.COUNT >= 0 THEN 'equal or bigger' ELSE 'smaller' END,
@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;

このコードを実行した後、行われた比較が 0 と等しいかそれよりも大きい場所を確認することを期待しますが、代わりに非常に異なる結果が得られます。

私が何を意味するかを見るためのリンクの下:

http://sqlfiddle.com/#!2/6be4a/1

ここで何が問題なのかを知りたいのですが、解決策が欲しいです。

敬具

4

1 に答える 1

1

これはどう:

http://sqlfiddle.com/#!2/6be4a/7

select * from (
SELECT
    t.ID, t.CODE, t.COUNT,
    @PREVCOUNT,
    @PREVCOUNT - t.COUNT DIFFERENCE,
    CASE @PREVCOUNT - t.COUNT WHEN @PREVCOUNT - t.COUNT >= 0 THEN 'equal or bigger' ELSE 'smaller' END,
    @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;
于 2013-01-26T15:07:45.817 に答える