sql - 在 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
解决方案
你可以简单地使用
>=
和<=
喜欢:SELECT * FROM ELBAT T WHERE T.FACTORS >= 'ABCD' AND T.FACTORS <= 'HIJK';
(放一个索引
FACTORS
来支持它。)如果它必须是数字,您可以使用
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
可能会有所帮助。)您还可以通过使用(相关)子查询来模拟排名而不使用
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 替换为它。在这种情况下,模拟排名可能比使用窗口函数的排名表现更好。
推荐阅读
- flutter - Flutter:更新滚动视图物理而不重建
- iframe - iframe 为 Grafana 显示“拒绝连接”
- java - 如何在正则表达式 Jlex 中选择特定单词?
- mysql - 将字符串从 MySQL 转换为 JSON,意外的令牌 N
- reactjs - React.js:登录时如何获取并显示当前用户?
- python - 从 Cygwin 扫描 Windows 中的驱动器
- macos - 为什么 /usr/libexec/java_home 不打印任何内容?
- python - Python Pandas:使用 apply 方法从另一个数据框中更新多个列值
- c++ - 如何检测和处理算法中不受支持的语言环境?
- batch-file - 我正在尝试编写一个批处理命令以在工作区中自动运行 VSCode,但是当我关闭 CMD 时,VSCode 也会关闭