2016-10-09 38 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 

我可以通過創建兩個表來做到這一點,但我希望成爲一個奇特的查詢者,並一步完成所有工作。任何指針?這是我的查詢到目前爲止:

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數據庫瀏覽器,但如果我問能不能用它來完成,即我們需要一個功能沒有的SQLite數據庫瀏覽器可用,我可以使用其他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

有一種可能性,讓多個用戶對同一時期在最後的表,如果他們已經取得最大在一起.. – Esty

相關問題