【问题标题】:SQL query to get lowest 2 values of a counted query selection (using db2)?SQL 查询以获取计数查询选择的最低 2 个值(使用 db2)?
【发布时间】:2023-12-20 02:43:01
【问题描述】:

假设我已经有一个返回以下内容的查询:

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)}。我该怎么做呢?

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: sql count db2 selection


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我没有方便测试的 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 个值(将 DENSE_RANK() 替换为 RANK() 以忽略平局或将 2 替换为任意数字以获得前 n 个值。

        【讨论】:

          最近更新 更多