首页 > 解决方案 > 在 SQL(ORACLE) 中获取前 N 个类别(变量的维度)

问题描述

请帮助处理以下查询请求。谢谢。

来自 ORACLE 的 SQL 查询一次获取前 100 个(任意 N)个类别(维度)的数据。下一次可以是下一次。这是为了控制数据大小 EG:一次从 ABCD 到 HIJK 获取 FACTORS 的数据。下次还剩2个等等。

EG: Table
ID  FACTORS VALUE
1   ABCD    100
2   ABCD    101
3   ABCD    102
4   ABCD    103
5   ABCD    104
6   DEFG    105
7   DEFG    106
8   DEFG    107
9   DEFG    108
10  DEFG    109
11  DEFG    110
12  HIJK    111
13  HIJK    112
14  HIJK    113
15  HIJK    114
16  HIJK    115
17  HIJK    116
18  MNOP    117
19  MNOP    118
20  MNOP    119
21  MNOP    120
22  MNOP    121
23  99-1    122
24  99-1    123
25  99-1    124
26  99-2    125
27  99-2    126

标签: sqloracle

解决方案


  1. 你可以简单地使用>=<=喜欢:

    SELECT *
           FROM ELBAT T
           WHERE T.FACTORS >= 'ABCD'
                 AND T.FACTORS <= 'HIJK';
    

    (放一个索引FACTORS来支持它。)

  2. 如果它必须是数字,您可以使用RANK()窗口函数对行进行排名:

    SELECT *
           FROM (SELECT T.*,
                        RANK() OVER (ORDER BY T.FACTORS) R
                        FROM ELBAT T) X
           WHERE X.R >= $n
                 AND X.R <= $m;
    

    $n并且$m是数字范围,将它们替换为相应的文字。再次索引FACTORS可能会有所帮助。)

  3. 您还可以通过使用(相关)子查询来模拟排名而不使用RANK()窗口函数:

    WITH CTE
    AS
    (
    SELECT DISTINCT
           T.FACTORS
           FROM ELBAT T
    )
    SELECT *
           FROM ELBAT T
           WHERE T.FACTORS >= (SELECT C1.FACTORS
                                      FROM CTE C1
                                      WHERE (SELECT COUNT(*)
                                                    FROM CTE C2
                                                    WHERE C2.FACTORS <= C1.FACTORS) = $n)
                 AND T.FACTORS <= (SELECT C1.FACTORS
                                          FROM CTE C1
                                          WHERE (SELECT COUNT(*)
                                                        FROM CTE C2
                                                        WHERE C2.FACTORS <= C1.FACTORS) = $m);
    

    $n并且$m是数字范围,将它们替换为相应的文字。再次索引FACTORS可能会有所帮助。)

    如果您实际上得到了一个包含不同因子的表,请将 CTE 替换为它。在这种情况下,模拟排名可能比使用窗口函数的排名表现更好。


推荐阅读