SQL查询获取计数查询选择的最低2个值(使用db2)?

时间:2010-06-11 15:08:57

标签: sql count db2 selection

想象一下,我已经有了一个返回以下内容的查询:

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 个答案:

答案 0 :(得分:1)

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)

这里的想法是将请求分解为其独立的部分。首先,找到最低值。然后找到大于最低值的下一个值。

答案 1 :(得分:0)

如果您使用的是db2的7或更高版本,那么只有FETCH FIRST n ROWS ONLY构造。我不知道是否有任何方法来解释关系(我不使用db2)。该子句在ORDER BY子句之后添加。

答案 2 :(得分:0)

我没有一个可以测试的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不能直接在WHERE子句中使用OLAP函数。)

这将给出前2个值,包括tie(用RANK()替换DENSE_RANK()忽略关系或用任意数字替换2得到top-n值。