2011-12-28 15 views
4

内のフィールドの合計を持つすべての項目を選択します。私はあまりfile_timeを持つすべての項目が事前に定義された範囲内でFILE_SIZEの合計を持っていることをそのようなアイテムを見つけたい私は単純なテーブル持って、指定した範囲

file_size file_id file_time 
    1  1   19 
    2  2   20 
    3  3   21 
    4  4   22 
    5  5   23 

を。 私は次のクエリを書か:このクエリは、正しい結果を得る

SELECT * FROM test_table AS D0 WHERE 
(SELECT TOTAL(file_size) FROM test_table AS D1 WHERE 
D1.file_time <= D0.file_time ORDER BY file_id) 
BETWEEN 1 AND 9 

1  1   19 
    2  2   20 
    3  3   21 

をしかし、必要な項目は同じfile_timeフィールドを持っている場合、このクエリは動作しません。

file_size file_id file_time 
    1  1   20 
    2  2   20 
    3  3   20 
    4  4   20 
    5  5   20 

が望まこのデータの結果は次のとおりです。

1  1   20 
    2  2   20 
    3  3   20 

file_idフィールドは一意です。 私のSQLクエリで何が問題になっていますか?私は理解している場合

CREATE TABLE test_table (file_size INT, file_id INT, file_time INT) 
INSERT INTO test_table VALUES(1,1,20) 
INSERT INTO test_table VALUES(2,2,20) 
INSERT INTO test_table VALUES(3,3,20) 
INSERT INTO test_table VALUES(4,4,20) 
INSERT INTO test_table VALUES(5,5,20) 
+1

があなたの期待された結果とは何ですか?それは私には分かりません。 –

+0

指定された範囲のfile_sizeの合計を持つ古い(file_timeによる)項目をすべて検索します。元のクエリはOKですが、file_timeは一意です。 – user1119412

+0

それは両方の場合であなたが望むのと同じように、うまく動作します。 –

答えて

1

を考える:

コードは、テストテーブルを作成します列file_idのいずれかを考慮する。あなたはfile_timefile_idのペアを使用する必要がありますし、次のように辞書的にそれらを比較する必要があります

SELECT * 
FROM test_table AS D0 
WHERE (

    SELECT TOTAL(file_size) 
    FROM test_table AS D1 
    WHERE D1.file_time < D0.file_time 
    OR (
    D1.file_time = D0.file_time 
    AND D1.file_id <= D0.file_id 
) 
    ORDER BY file_time, file_id DESC 
) 
BETWEEN 1 
AND 9 
0

わからないが、あなたがしたいので、私は、あなたがあなたのクエリ内の単一の列としてfile_timeを考えるべきではありません

-- sum of file sizes between 1 and 7 with the lowest time 
SELECT SUM(test.file_size) AS sum_file_size, test.file_time 
FROM test 
WHERE (test.file_time = (SELECT TOP 1 test.file_time 
          FROM test 
          ORDER BY file_time)) 
AND (test.file_size BETWEEN 1 AND 9) 
GROUP BY test.file_time; 

-- sum of file sizes per time `group` 
SELECT SUM(test.file_size) AS sum_file_size, test.file_time, 
FROM test 
WHERE (test.file_size BETWEEN 1 AND 7) 
GROUP BY test.file_time 
ORDER BY test.file_time; 
+0

ユニークなfile_time(19,20,21,22 ...)の場合でもクエリが機能しません – user1119412

+0

それはうまくいかない、つまりエラーが発生していたり​​、何もしたくないということですか? –

+0

エラーはありません(sqliteはTOPをサポートしていません - LIMITに置き換えられました)。クエリの結果が間違っています。作業クエリ:SELECT SUM(file_size)AS sum_file_size、file_time、file_id FROM first WHERE(file_time <=(file_timeから最初のORDER BY file_time LIMIT 1まで))AND(first.file_sizeと1の間のファイル)GROUP BY first.file_time ; file_time - {{1,18}、{2,19}、{3,20}、{4,21}、{5,22}のペアの場合、{{1,18}、{2 、19}、{3,20}}となる。しかし、あなたのクエリは{1,18}を返します。 – user1119412

関連する問題