2017-09-07 47 views
0

如何使用SQL轉換下列數據:如何使用SQL創建重組數據的新表?

cat score 
1  2 
1  3 
2  1 
2  3 
2  5 
3  1 
3  2 
3  3 
3  4 

創建子集:

cat score1 score2 
1 2  3 
2 1  3 
3 1  2 

所以,只有前兩個分數列「貓」的每個值被放置到轉換表中。

+2

什麼rdbms(SQL Server,MySQL等) – SQLChao

+1

我們如何知道哪個分數是score1以及哪個分數是score2?總是得分較小1?或者它有什麼關係? – xQbert

+2

前兩個分數你是指兩個最低的? –

回答

2

一種可能的方法是在貓上使用自聯接,但a.score < b.score以便從b獲得下一個最小值。但是,如果您需要深入n層,這並不能很好地擴展。在這種情況下,使用模擬行號的用戶變量對每列進行條件聚合可能會更好。

這是假設Score1 - X總是你想顯示最低到最高分。如果需要,我們也可以從最高到最低,或者我們可以使用規則來管理哪些被選中。

DEMO:http://rextester.com/NHDS97935

SELECT A.cat, Min(A.score) score1, min(B.Score) score2 
FROM SO46102892 A 
INNER JOIN SO46102892 B 
    on A.cat = B.Cat 
    and A.score < B.Score 
GROUP BY a.cat; 

,並提供:

+----+-----+--------+--------+ 
| | cat | score1 | score2 | 
+----+-----+--------+--------+ 
| 1 | 1 |  2 |  3 | 
| 2 | 2 |  1 |  3 | 
| 3 | 3 |  1 |  2 | 
+----+-----+--------+--------+ 

或者(因爲這給出了一個更好的成績ň縮放方法)

DEMO:http://rextester.com/VLCC24693

哪簡單地通過向外部選擇添加一個case語句來處理n分數更加優雅。

在這種情況下,我們通過使用兩個用戶變量並根據需要調整它們的值來模擬row_number() over (partition by cat order by cat, score)

單獨運行此部分:

SELECT case when [email protected] then @RN:[email protected]+1 else @RN:=1 end RN 
    , case when [email protected] then @cat else @cat:=cat end cat 
    , score 
FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A 
CROSS JOIN (SELECT @RN:=0, @Cat:=0) z 

你可以看到每個RN是如何分配1-X爲每個類別模擬其他RDBMS提供ROW_NUMBER功能。

SELECT cat 
    , max(case when RN = 1 then score end) as Score1 
    , max(case when RN = 2 then score end) as Score2 
    , max(case when RN = 3 then score end) as Score3 
    , max(case when RN = 4 then score end) as Score4 
    , max(case when RN = 5 then score end) as Score5 
FROM (SELECT case when [email protected] then @RN:[email protected]+1 else @RN:=1 end RN 
      , case when [email protected] then @cat else @cat:=cat end cat 
      , score 
     FROM (SELECT * FROM SO46102892 ORDER BY cat, score) A 
     CROSS JOIN (SELECT @RN:=0, @Cat:=0) z 
    ) y 
GROUP BY cat 
ORDER BY cat; 

給予我們:

+----+-----+--------+--------+--------+--------+--------+ 
| | cat | Score1 | Score2 | Score3 | Score4 | Score5 | 
+----+-----+--------+--------+--------+--------+--------+ 
| 1 | 1 |  2 |  3 | NULL | NULL | NULL | 
| 2 | 2 |  1 |  3 | 5  | NULL | NULL | 
| 3 | 3 |  1 |  2 | 3  | 4  | NULL | 
+----+-----+--------+--------+--------+--------+--------+ 

,我們可以簡單地通過從外部選擇刪除它排除得分3,4,5。

+0

@SimonRH更新以消除替代答案的子問題中的額外案例陳述。 – xQbert

相關問題