想象一下,我已经有了一个返回以下内容的查询:
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)}
。我该怎么做呢?
任何帮助都将受到高度赞赏。感谢。
答案 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值。