1

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, @NEWID := COALESCE(@NEWID - 1, t.ID) AS NEWID, t.CODE, t.COUNT
FROM
(SELECT ID, CODE, COUNT FROM some_table WHERE CODE = 'AB' ORDER BY ID DESC) t,
(SELECT @NEWID := NULL) _uv;

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

そして今、私はそれぞれの連続するNEWIDの差を数えたいと思います。

それで

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

私はこれを行うことに慣れています

LEFT OUTER JOIN some_table t2 ON t.ID = ( t2.ID + 1 ) 

次に、t2.countとt.countの違いを調べますが、COALESCEを使用している場合、このNEWIDを選択できないため、以下のコードは機能しません。

LEFT OUTER JOIN some_table t2 ON t.NEWID = ( t2.NEWID + 1 ) 

では、この問題をどのように解決する必要がありますか?

4

2 に答える 2

1

これを試して:

SELECT 
 t1.ID as ID1, 
 t2.ID as ID2, 
 t1.CODE as CODE, 
 t1.COUNT as C1, 
 t2.COUNT as C2,
 t2.COUNT - t1.COUNT as DIFF
FROM 
  some_table t1 
  INNER JOIN some_table t2 ON t1.ID < t2.ID AND t1.CODE = t2.CODE
WHERE
  t1.CODE='AB'
  AND NOT EXISTS 
   (SELECT * FROM some_table t3
    INNER JOIN some_table t4 ON t3.ID < t4.ID and t3.CODE = t4.CODE
    WHERE 
        t3.CODE='AB'
        AND t1.ID = t3.ID
        AND t4.ID < t2.ID 
      )
ORDER BY t1.ID

別の方法は、LIMITを使用することです。

SELECT
 t.ID1 AS ID,
 t.CODE as CODE,
 t.C2-t.C1 AS DIFF
FROM
(
SELECT 
 t1.ID as ID1, 
 t1.CODE as CODE, 
 t1.COUNT as C1, 
 (SELECT t.COUNT 
  FROM some_table t
  WHERE t.ID > t1.ID AND t.CODE=t1.CODE 
  ORDER BY t.ID 
  LIMIT 1) as C2
FROM 
  some_table t1 
WHERE
  t1.CODE='AB'
ORDER BY t1.ID) t
ORDER BY t.ID1

http://sqlfiddle.com/#!2/e0b8b/24

于 2013-01-26T11:42:54.813 に答える
1

そういうわけで、シーケンシャルIDが必要でした。ええと、これにもユーザー変数を使うことができます、そしてあなたも必要ありませんNEWID!このようなことをしているので、ユーザー変数がどのように機能するかをよく読んでおくとよいでしょう。

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;

SQLフィドル

于 2013-01-26T12:09:25.350 に答える