sql - Oracle SQL UNION 替代方案
问题描述
我正在使用ORACLE SQL
(11g),假设我们有一个名为的表,该表TRANSMISSIONS
的字段包含file sizes
partitions
我想针对不同的文件大小执行各种聚合函数。但是我希望分区是累积的。所以一个10 KB
文件将同时在<=500000 bytes
分区和<=2000000000
分区中。因此,如果我有 5 个文件<=500000
和 5 个文件,> 50000 && < 2000000000
那么我将得到以下结果:
label | number
---------------|-------
<=500000 | 5
<=2000000000 | 10
所以基本上最初的方法是做这样的联合:
SELECT '<=500000' as label,
COUNT(1) AS numberFiles,
round(avg(tra.TRA_SIZE)) as averageSize,
sum(tra.TRA_SIZE) as totalSize
FROM TRANSMISSION tra
where tra.TRA_SIZE <= 500000
UNION
SELECT '<=2000000000' as label,
COUNT(1) AS numberFiles,
round(avg(tra.TRA_SIZE)) as averageSize,
sum(tra.TRA_SIZE) as totalSize
FROM TRANSMISSION tra
where tra.TRA_SIZE <= 2000000000;
但是,如果我有几个partitions
这样的操作,它将导致一个巨大的不可维护的查询,其中唯一改变的基本上是label
andwhere
子句。
有没有更好的方法来做到这一点?
解决方案
你可以试试这个:
WITH limits(n) AS (
SELECT 500000 FROM DUAL
UNION ALL
SELECT n+500000 FROM limits
WHERE n < 10000000
)
SELECT
'<=' || to_char(n,'00000000') AS label,
round(avg(tra.TRA_SIZE)) as averageSize,
sum(tra.TRA_SIZE) as totalSize
FROM TRANSMISSION tra
CROSS JOIN limits
WHERE tra.TRA_SIZE <= n
GROUP BY n
ORDER BY n
不过,您可能想要更改限制。
推荐阅读
- html - 复选框可访问性显示没有关系
- python - 如何获取数据框中的行子集,不包括几行 python pandas
- .net-core - dot Net Core 中的身份验证
- c# - DatePicker 列的 WPF DataGridCellInfo 项属性值
- c# - 有没有办法将控制台的光标左侧位置设置为最小值?
- android - 如何在 Android 的图库中保存和显示图像
- c - printf 正在产生异常的响应
- python - 有没有一种有效的方法将字符串拆分为带有 numba 的列表?
- gcc - 如何在启动时自动运行两个 gdb 命令
- winapi - MFC:有没有办法将 CMFCShellTreeCtrl 限制为特定的根文件夹?