SQL - возвращает первые 3 записи в поле - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть следующее подмножество данных:

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

Используя MySQL, мне нужно вернуть верхние 3 (самые большие значения) из 'Value 1' и 'Value 2', основываясь на тикере,Например, я хочу найти 3 самых больших значения «Значение 1» и «Значение 2», где тикером является «AAWW» (который может существовать в столбце «Тикер А» или «Тикер В»), но я хочу, чтобы другой тикер был связан с ним.с этим, за ценность.Исходя из приведенных выше данных и этого сценария, мой желаемый набор записей будет:

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 Ответ

1 голос
/ 07 апреля 2011

Попробуйте это (при условии, что у вас нет столбца идентификатора, в противном случае замените @ rownum / rank на ID):

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:=@rownum+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:=@rownum+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
...