2016-06-22 68 views
8

嗨,我有一個列J1,J2,J3,J4,J5,J6,J7的表。我想從這些列中找到最大的3個值,分別爲L1,L2,L3。如何從SQL中的不同列中查找第一,第二和第三大值

我想下面的查詢來查找第一大

SELECT (
    SELECT Max(v) FROM (
     VALUES 
      ([J1]), ([J2]), 
      ([J3]), ([J4]), 
      ([J5]), ([J6]), 
      ([J7]) 
    ) AS value(v) 
) as [L1]FROM dbo.JTable 
+0

表中是否有PK? –

+0

PL/SQL是Oracle存儲過程的語言。 SQL Server是完全不同的DBMS。那麼你最近使用的是什麼? Oracle或SQL Server?從這個例子來看,它是SQL Server,而不是Oracle –

+1

一般來說,一個破損的數據模型的標誌 - 同一個「類型」的所有值(比較兩個這樣的值是比較有意義的,或者計算它們的聚合)是應該的*一個*欄。然後應該有一個額外的列,如果數字1-7實際上是有意義的* data *已經嵌入到列名中。 –

回答

6

如果你的表中有一個PK,說id,那麼你可以使用一個查詢,員工UNPIVOT

SELECT * 
FROM (
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
    Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
WHERE t.rn <= 3 

如果您想要每id一行,那麼你可以使用PIVOT撤消UNPIVOT操作:

SELECT id, [1], [2], [3] 
FROM (
    SELECT id, Val, rn 
    FROM (
    SELECT id, Val, Col, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
     Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
    WHERE t.rn <= 3) AS src 
PIVOT (
    MAX(Val) FOR rn IN ([1], [2], [3])) AS pvt 
+0

它沒有獲取前3個值,我稍微修改了一下查詢,因爲我需要從53列的列表中獲得前8個值,並且它有2000多行。以下是我用於'\t \t \t \t SELECT id,[1],[2],[3] .....,[7],[8] INTO TEMP6 \t \t \t \t FROM(SELECT ID,纈氨酸,氡 \t \t \t \t FROM(SELECT ID,纈氨酸,山口, \t \t \t \t ROW_NUMBER()OVER(PARTITION BY ID ORDER BY纈氨酸DESC)用作Rn \t \t \t \t FROM TEMP5 \t \t \t \t UNPIVOT(VAL FOR山口IN([Week1], \t \t \t \t [Week2],[譯員更加],[Week4] ..... [Week53] \t \t \t \t))AS unpvt)AS噸 \t \t \t \t WHERE t.rn <= 8)AS SRC \t ([1],[2],...,[7],[8]))的PIVOT(MAX(Val))AS pvt' –

相關問題