SQL-запрос для получения 2 самых низких значений из подсчитанного выбора запроса (используя db2)? - PullRequest
0 голосов
/ 11 июня 2010

Представьте, что у меня уже есть запрос, который возвращает следующее:

Col1 | Col2
------------
 A   |   2
 B   |   3
 C   |   3
 D   |   4
 E   |   8
    ...

Скажем, я использовал что-то вроде этого:

select Col1, count ( * ) as Col2 \ 
from ...
where ...
order by Col2 \ 
group by Col1 \ 

Итак, все, что я хочу выбрать, это (Col1, Col2), чтобы он возвращал выборки (a, b) and (c, d) where (b >= all (Col2)) and (d >= ((all (Col2)) - a)). Так что для приведенного выше примера он вернул бы {(A, 2), (B, 3), (C, 3)}. Как мне это сделать?

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

1 голос
/ 11 июня 2010
Select Col1, Col2
From #Test
    Cross Join  (
                Select Min(T2.Col2) As Lowest, Min(T3.Col2) As SecondLowest
                From #Test As T2
                    Join #Test As T3
                        On T3.Col2 > T2.Col2
                ) As T4
Where #Test.Col2 In(T4.Lowest, T4.SecondLowest)

Идея в том, чтобы разбить запрос на отдельные части. Сначала найдите самое низкое значение. Затем найдите следующее значение больше минимального значения.

0 голосов
/ 17 июня 2010

У меня нет под рукой DB2 для тестирования, но я думаю, что вы хотите сделать что-то вроде этого, используя функции olap, без необходимости объединения таблицы с самим собой:

SELECT Col1, Col2 
FROM (SELECT Col1, Col2, DENSE_RANK() OVER(ORDER BY Col2 Asc) As Rank
      FROM table) T
WHERE Rank <= 2
ORDER BY Col2 Asc

(Подвыбор необходим, поскольку DB2 не позволяет напрямую использовать функции OLAP в предложении WHERE.)

Это даст вам 2 верхних значения, включая связи (замените DENSE_RANK () на RANK (), чтобы игнорировать связи, или замените 2 на любое число, чтобы получить топ-n значений.

0 голосов
/ 11 июня 2010

Если вы используете db2 версии 7 или выше, тогда существует конструкция FETCH FIRST n ROWS ONLY. Я не знаю, есть ли способ объяснить это связями (я не использую db2). Предложение добавляется после предложения ORDER BY.

...