2016-10-09 10 views
2

によって期間ごとに最大のスコアを含む表Iは、このようなテーブルを持っている:SQLiteの:USER

USER PERIOD SCORE 
A  1  8 
A  1  9 
A  2  2 
A  2  3 
A  3  4 
A  3  5 
B  1  2 
B  1  3 
B  2  5 
B  2  4 
B  3  4 
B  3  4 
C  1  2 
C  1  3 
C  2  3 
C  2  5 
C  3  3 
C  3  4 

私は、ユーザーごとの期間あたりの平均スコアを計算する必要があるので、私はこの

にテーブルを変換する必要があります
USER PERIOD SCORE 
A  1  8.5 
A  2  2.5 
A  3  4.5 
B  1  2.5 
B  2  4.5 
B  3  4 
C  1  2.5 
C  2  4 
C  3  3.5 

そして最後に、私はこの

USER PERIOD SCORE 
A  1  8.5 
B  2  4.5 
A  3  4.5 
のように、唯一の各期間における最高のスコアと対応するユーザーを持つテーブルを作成する必要があります

私は2つのテーブルを作成することでこれを行うことができますが、私は素晴らしい質問者になりたいので、すべてを1つのステップで実行したいと思います。すべてのポインタ?これらは、これまでのところ、私のクエリです:

CREATE TABLE STEP1 AS SELECT 
    USER 
    ,PERIOD 
    ,AVG(SCORE) AS SCORE 
FROM STEP0 
GROUP BY 1,2 
; 
CREATE TABLE STEP2 AS SELECT 
    PERIOD 
    ,MAX(SCORE) AS SCORE 
FROM STEP1 
GROUP BY 1 
; 
CREATE TABLE FINAL AS SELECT 
    A.USER 
    ,B.PERIOD 
    ,B.SCORE 
FROM STEP1 A 
    JOIN STEP2 B 
     ON A.SCORE=B.SCORE 
; 

私はSQLiteのDBブラウザを使用していますが、私が求めているが、それを使用して行うことができない場合、つまり、我々はSQLiteのDBブラウザでは利用できない機能を必要とし、I別のSQLアプリケーションを使用することができます。

答えて

0

NOT EXISTS()を使用してみてください:

CREATE TABLE FINAL AS 
SELECT tt.* 
FROM (
    SELECT t.user,t.period,AVG(t.score) as score 
    FROM STEP0 t 
    GROUP BY t.user,t.period) tt 
WHERE NOT EXISTS (SELECT 1 FROM STEP0 s 
        WHERE s.period = tt.period 
        GROUP BY s.user 
        HAVING AVG(s.score) > tt.score) 
0
INSERT INTO STEP1 
SELECT users, Period, AVG(CAST(score AS float)) AS score 
    FROM TEST a 
    GROUP BY users, Period 

SELECT * FROM STEP1 

INSERT INTO STEP2 
SELECT 
A.Period, 
Max(A.score) as score 
FROM 
STEP1 A 
GROUP BY A.Period 

SELECT * FROM STEP2 

INSERT INTO FINAL 
SELECT A.users, A.Period, A.score 
FROM STEP1 A 
INNER JOIN STEP2 B ON A.score = B.score AND A.Period = B.Period 

SELECT * FROM FINAL 
+0

は、彼らが一緒に最高を獲得した場合、FINALテーブル内の同じ期間に複数のユーザーを取得する可能性があります。.. – Esty