sql - 如何在Oracle中将表行拆分为固定大小的块
问题描述
我有一个 100 万多行的大表,其中一个数字列作为主键。我正在尝试使用 Oracle sql 查询来获得大小为 500 的拆分。所以我有一种桶,每个桶有 500 条记录,并在该桶中给出它们的最大值和最小值。样本数据
pk_column column1 column2 column3
1002 abcd 1234 15-apr-20
1004 efgh 3435 14-apr-20
1007 ijkl 8855 16-apr-20
....
....
....
2002 asdf 8565 17-apr-20
2005 efgh 5894 14-apr-20
所需的输出如下所示
bucket_no no_of_element min_value max_value
1 500 1002 2002
2 500 2005 3002
3 500 3003 4002
4 480 4003 4500
我可以使用 NTILE 或 WIDTH_BUCKET 提出的代码无法确定存储桶大小的数量,因此没有任何元素是固定的。随着元素数量不断变化,我无法找到动态计算桶数并在 NTILE 或 WIDTH_BUCKET 窗口函数中使用它的方法。以分层方式使用 LEAD 和 LAG 函数非常令人困惑。任何人都可以建议如何解决这个问题。
解决方案
ROW_NUMBER
您可以按如下方式使用分析功能:
SELECT
RN AS BUCKET_NO,
COUNT(1) AS NO_OF_ELEMENT,
MIN(PK_COLUMN) AS MIN_VALUE,
MAX(PK_COLUMN) AS MAX_VALUE
FROM
( SELECT T.*,
MOD(ROW_NUMBER() OVER(ORDER BY PK_COLUMN) - 1, 500) + 1 RN
FROM YOUR_TABL T
)
GROUP BY RN
推荐阅读
- python - 使用海龟导入对角线打印形状
- javascript - 在两个 div 中的锚点中包装内容(包括文本节点)
- python - 为什么将变量与 0.0 进行比较会返回 false?
- javascript - 我怎样才能使它显示菜单上的所有内容而不必搜索?
- xamarin.forms - 如何使用 FFImageLoading 将动画 GIF 实现为启动画面
- lua - Lua 脚本在 TS3 解释中戳客户端
- javascript - 如何使用 JavaScript 设置 cookie?
- javascript - 如何使用 css-in-js 在悬停另一个元素时显示 div 元素?
- apache - 如何在 XAMPP 上设置虚拟主机?
- bash - Bash 环境变量连接