【问题标题】:Oracle SQL Group by ClauseOracle SQL 按子句分组
【发布时间】:2015-02-12 06:29:49
【问题描述】:

我想写一个 sql 来获取前 5 个表空间存储指标。下面的查询给出了关于所有 tbspace 的指标。欣赏是否有人对此进行微调以使其只有前 N

SELECT
ts.tablespace_name AS TBNAME,
round((ts.tablespace_size/1024/1024),2) AS SIZE_MB,
round((ts.tablespace_used_size/1024/1024),2) AS USED_MB,
round(((ts.tablespace_size - ts.tablespace_used_size)/1024/1024),2) AS     FREE_MB
FROM
mgmt$db_tablespaces ts,
(SELECT d.target_guid, d.tablespace_name, count(d.file_name) df_count,
sum(decode(d.autoextensible, 'YES', 1, 0)) auto_extend
FROM mgmt$db_datafiles d, mgmt$target t
WHERE t.target_guid = '<id>' AND
(t.target_type='rac_database' OR
(t.target_type='oracle_database' AND t.TYPE_QUALIFIER3 != 'RACINST')) AND
t.target_guid = d.target_guid
GROUP BY d.target_guid, d.tablespace_name) df
WHERE
ts.target_guid = df.target_guid AND
df.tablespace_name = ts.tablespace_name
ORDER BY ts.tablespace_size;`

谢谢

【问题讨论】:

    标签: sql oracle group-by tablespace


    【解决方案1】:

    您可以使用ROWNUM。 Oracle 在返回结果后将rownum 应用于结果。 您需要在返回结果后对其进行过滤,因此需要子查询。您还可以使用 RANK() 函数来获取 Top-N 结果。

      SELECT 
           * 
      FROM
          (
             SELECT
                ts.tablespace_name AS TBNAME,
                round((ts.tablespace_size/1024/1024),2) AS SIZE_MB,
                round((ts.tablespace_used_size/1024/1024),2) AS USED_MB,
                round(((ts.tablespace_size - ts.tablespace_used_size)/1024/1024),2) AS     FREE_MB
           FROM
              mgmt$db_tablespaces ts,
              (SELECT d.target_guid, d.tablespace_name, count(d.file_name) df_count,
                  sum(decode(d.autoextensible, 'YES', 1, 0)) auto_extend
                FROM mgmt$db_datafiles d, mgmt$target t
                WHERE t.target_guid = '<id>' AND
                (t.target_type='rac_database' OR
                (t.target_type='oracle_database' AND t.TYPE_QUALIFIER3 != 'RACINST')) AND
                t.target_guid = d.target_guid
               GROUP BY d.target_guid, d.tablespace_name) df
           WHERE
            ts.target_guid = df.target_guid AND
            df.tablespace_name = ts.tablespace_name
           ORDER BY ts.tablespace_size
          )
      WHERE ROWNUM <= 5;
    

    【讨论】:

    • 这不起作用是什么意思你得到什么错误?
    • 那不是一个有效的 SQL。我添加了 RANK() 并得到了我想要的输出。
    • 分号放错了,旁边有个引号,必须去掉。一个简单的复制和粘贴错误。这是我能在这里发现的唯一语法错误。
    • 您通常不会将 RANK 用于 top-n 查询,而是使用 DENSE_RANK 或 ROW_NUMBER(尽管 RANK 仍然是一个有效选项)。 @Prakash:如果您想使用这三种中的任何一种,请考虑哪一种适合您的情况。
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2015-10-17
    • 2013-01-10
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-04-08
    相关资源
    最近更新 更多