2011-06-18 10 views
2

SQLiteテーブルがあり、SELECT命令の行位置を含む列を追加する必要があります。
SELECT命令には2つの順序句が含まれています。SQLite:行位置を含む列を追加する

場合、それはここでは、はっきりしていない例を示します。
は、このデータを考える:

id  | c1  | c2 
=============================== 
a   | 1  | 2  
b   | 1  | 3  
c   | 1  | 1  
d   | 2  | 2  
e   | 2  | 3  
f   | 2  | 1  

そして、このクエリ:

SELECT * FROM table ORDER BY c1, c2 

私はこの結果のテーブルが必要になります。

id  | c1  | c2  | position 
========================================= 
a   | 1  | 2  | 2 
b   | 1  | 3  | 3 
c   | 1  | 1  | 1 
d   | 2  | 2  | 5 
e   | 2  | 3  | 6 
f   | 2  | 1  | 4 

どうすればいいですか?

重要なお知らせ: これは実際のデータでも実際の列でもありません。それは単なる例です。

+1

まあ、特にそれらのデータを与え、あなたは(C1 - 1) 'と' position'値を得ることができた* 3 + c2'。それは大丈夫でしょうか? –

+0

私は、特定のデータセットで与えられた最小係数(3)を使用する理由はありません。オーバーラップを引き起こす可能性のある最小値(オーバラップ/不正確な順序の危険性がある)と値の間の何らかの中間の方法はありますか? –

答えて

1

このクエリでは、あなたが後にあるすべてのフィールドを与える必要があります。

SELECT 
    (SELECT COUNT(0) 
    FROM MyTable T1 
    WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2 
    ) as 'position', 
    c1, 
    c2, 
    ID 
FROM 
    MyTable T2 
ORDER BY 
    (c1 * 1000) + c2 

、IDによってそれらを注文する:

SELECT ID, c1, c2, position FROM 
    (SELECT 
    (SELECT COUNT(0) 
     FROM MyTable T1 
     WHERE (T1.c1 * 1000) + T1.c2 <= (T2.c1 * 1000) + T2.c2 
    ) as 'position', 
    c1, 
    c2, 
    ID 
    FROM 
    MyTable T2 
    ORDER BY 
    (c1 * 1000) + c2 
) T3 
ORDER BY ID 

ノート

  • Order Byの内部が機能しない場合は、中間結果を一時表にダンプしてから、最後のOrder By句を使用して一時表から選択することができます。
  • 上記の「1000」は係数です。この係数がc2の最大値よりも大きいことを確認する必要がありますが、整数のオーバーフローが発生するほど高くはありません。

代替方法

あなたはAutoIncrement列を一時テーブルに挿入して、ご希望の順序に基づいて、その一時テーブルから値を選択することができます。

http://www.sqlite.org/autoinc.html

+1

+1テンポラリテーブルと興味深いクエリを参照してください:) –

関連する問題