2011-04-07 150 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