2011-04-07 117 views
0

我有數據的子集:使用MySQLSQL - 返回前3條記錄每場

Ticker A | Ticker B | Value 1 | Value 2 
AAU  AAV  -0.49  0.98 
AAU  AAWW  -0.68 -0.34 
AAU  AAXJ  -0.82  0.54 
AAU  AB   -0.49 -0.98 
AAV  AAWW  0.74 -0.52 
AAV  AAXJ  0.69  0.36 
AAV  AB   0.27 -1.00 
AAWW  AAXJ  0.89  0.61 
AAWW  AB   0.62  0.54 
AAXJ  AB   0.54 -0.34 

,我需要從兩個「值1」和「值2返回前3名(最大值) ',基於股票。例如,我想要查找代碼爲'AAWW'(可存在於代碼A或代碼B的列中)的3個最大「值1」和「值2」,但我希望查看另一個代碼相關聯與它,每個價值。基於以上數據和該場景,我期望的記錄集爲:

Ticker | Value 1 | Ticker | Value 2 
AAV  0.89  AAXJ  0.61 
AAXJ  0.72  AB  0.54 
AB  0.62  AAU  -0.34 

理想情況下,我想在沒有存儲過程的情況下執行此操作。那可能嗎?

回答

1

試試這個(假設你沒有一個ID列,否則ID代替@ ROWNUM /排名):

SELECT T1.SUB_Ticker, T1.VALUE1, T2.SUB_Ticker, T2.VALUE2 
    FROM 
(SELECT CASE WHEN TickerA = 'AAWW' THEN TickerA ELSE TickerB END Ticker, 
     CASE WHEN TickerA = 'AAWW' THEN TickerB ELSE TickerA END SUB_Ticker, 
     VALUE1, 
     @rownum:[email protected]+1 ‘rank’ 
    FROM data_table d, (SELECT @rownum:=0) r 
WHERE TickerA = 'AAWW' OR TickerB = 'AAWW' 
ORDER BY VALUE1 DESC 
LIMIT 3) T1 
JOIN 
(SELECT CASE WHEN TickerA = 'AAWW' THEN TickerA ELSE TickerB END Ticker, 
     CASE WHEN TickerA = 'AAWW' THEN TickerB ELSE TickerA END SUB_Ticker, 
     VALUE2, 
     @rownum:[email protected]+1 ‘rank’ 
    FROM data_table d, (SELECT @rownum:=0) r 
WHERE TickerA = 'AAWW' OR TickerB = 'AAWW' 
ORDER BY VALUE2 DESC 
LIMIT 3) T2 ON T1.rank = T2.rank 
+0

看起來不錯。我唯一需要改變的是將第二個@rownum變量重命名爲不同的東西(例如:@ rownum2),因爲聯合語句的排名似乎並未消失。 – bgeveritt 2011-04-11 20:58:53