如何使用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
所以,只有前兩個分數列「貓」的每個值被放置到轉換表中。
如何使用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
所以,只有前兩個分數列「貓」的每個值被放置到轉換表中。
一種可能的方法是在貓上使用自聯接,但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。
@SimonRH更新以消除替代答案的子問題中的額外案例陳述。 – xQbert
什麼rdbms(SQL Server,MySQL等) – SQLChao
我們如何知道哪個分數是score1以及哪個分數是score2?總是得分較小1?或者它有什麼關係? – xQbert
前兩個分數你是指兩個最低的? –