2014-02-19 193 views
1

請幫忙寫一個將整理數據的SQL腳本。
一個關鍵的難點 - 需要創建一個額外的列進行排序。
我試圖描述儘可能詳細的情況。
帶查詢的SQL查詢

讓我們開始吧。有以下形式的表:
datas
我們會在收到用戶ID和返回數據,只有那些沒有誰他,但也有其他人。
下一步:按人工創建的列進行排序。

接下來,我會一步一步來。
那麼我的意思是人爲的列:
這一列將包含估計之間的差異。所以要得到它 - 您需要先執行一些操作:
根據設置用戶和其他用戶的信息來計算評估差異,並獲得平均分數。
下面的兩張圖片顯示了相同的數據,然後是計算本身,在我看來 - 這很簡單。
enter image description here


計算此列如下:

User with 2nd id: 
1: 5 - 1 = 4; 
2: 2 - 9 = -7; 
3: next data what is in user 1 - absent in user 2, and we ease pass it; 
User with 3rd id: 
1: 3 - 1 = 2; 
2: the next data's is absent in user with 3rt id; 
3: 8 – 9 = -1; 
4: 6 – 2 = 4; 
5: passed; 

End in the end: 
User_2 will have new mark = -1.5 
User_3 will have new mark = 1.66666 

而在最後,我需要回到表: enter image description here
但是這還不是全部。通常情況下,數據將被複制,我希望從所獲得的數據中獲得平均結果。請看下面的例子:

enter image description here

這是結束。我真的需要你的幫助,專家。我自己教SQL代碼,但這對我來說很困難。
有做腳本如下的想法:

SELECT d.data, (d.mark + myCount(d.user, 1)) newOrder 
FROM info d 
WHERE -- data from user_1 NOT equal data from other users 
ORDER BY newOrder; 

但腳本將執行大量的時間,因爲它使用其自身的功能,可以用做查詢到每個用戶,而不是記錄。我希望有人能夠應付這個任務。

回答

1

追隨你的步驟:

首先,我們需要將數據從選定的用戶隔離(假設它是1):

CREATE TEMP TABLE sel_user AS 
SELECT data, mark FROM info d WHERE user = 1; 

現在,我們計算大關的用戶有(再次,所選擇的用戶是1):

SELECT d.user user, d.mark - s.mark mark 
FROM info d JOIN sel_user s USING (data) 
WHERE d.user <> 1; 

結果:

user  mark  
---------- ---------- 
2   4   
2   -7   
3   2   
3   -1   
3   4   

我們可以查詢只平均:

SELECT d.user user, AVG(d.mark - s.mark) mark 
FROM info d JOIN sel_user s USING (data) 
WHERE d.user <> 1 GROUP BY user; 

user  mark  
---------- ---------- 
2   -1.5  
3   1.66666666 

但你還是想這樣做與不對應於用戶1的標記算了一筆賬:

SELECT d.user user, mark FROM info d 
WHERE d.user <> 1 AND d.data NOT IN (SELECT data FROM sel_user); 
user  mark  
---------- ---------- 
2   4   
3   3   
3   10 

具體來說,要添加先前計算平均每行:

SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
    SELECT d.user user, AVG(d.mark - s.mark) mark 
    FROM info d JOIN sel_user s USING (data) 
    WHERE d.user <> 1 GROUP BY user 
) d2 USING (user) 
WHERE d.data NOT IN (SELECT data FROM sel_user) 
ORDER BY neworder DESC; 
user  data  neworder   
---------- ---------- ---------------- 
3   6   11.6666666666667 
3   3   4.66666666666667 
2   5   2.5    

而且你的最後一個請求是讓平均每個data

SELECT data, AVG(neworder) final FROM (
    SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
     SELECT d.user user, AVG(d.mark - s.mark) mark 
     FROM info d JOIN sel_user s USING (data) 
     WHERE d.user <> 1 GROUP BY user 
    ) d2 USING (user) 
    WHERE d.data NOT IN (SELECT data FROM sel_user) 
) 
GROUP BY data 
ORDER BY final DESC; 
data  final   
---------- ---------------- 
6   11.6666666666667 
3   4.66666666666667 
5   2.5  
+0

類似的方法來我的想法,但我正在做一個自我連接的原則。 – DRapp