【问题标题】:Find sum of unique values based on another distinct column根据另一个不同的列查找唯一值的总和
【发布时间】:2021-08-13 17:28:57
【问题描述】:

我是 Oracle 的新手。我在 Oracle Database 12c 版本上工作。一个文件有两个数据文件副本#。我只需要计算第二组文件#的备份数据文件副本的总大小,不包括第一个副本。

查询的输出显示一个文件的两个或多个副本#

如果我总结得出数据文件的总大小,它会显示两个数据文件副本的总和。

SQL> select sum((datafile_blocks)*8/1024) from v$BACKUP_DATAFILE;

SUM((DATAFILE_BLOCKS)*8/1024)
-----------------------------
                    10738.375

我只需要第一个副本或第二个副本的总大小

SQL> select file#,count(*),sum((datafile_blocks)*8/1024) from v$BACKUP_DATAFILE group by file#;

     FILE#   COUNT(*) SUM((DATAFILE_BLOCKS)*8/1024)
---------- ---------- -----------------------------
         1          2                          1900
         6          2                      3588.625
         2          2                         32.25
         5          2                          2500
         4          2                           670
         8          2                         87.25
         3          2                          1780
         7          2                         32.25
         9          2                       108.125
        10          2                            20
         0          4                        19.875

11 rows selected.

如果我用有子句分组,它显示0行

SQL> select sum((datafile_blocks)*8/1024) from v$BACKUP_DATAFILE group by file# having count(file#)=1;

no rows selected

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您确定要解雇一些file#s吗?

    在我的 18cXE 上,有“重复的”file# 值,但是 - 请参阅 datafile_blocks - 它们是不同的

    SQL> select file#, datafile_blocks, block_size
      2  from v$backup_datafile
      3  order by file#;
    
         FILE# DATAFILE_BLOCKS BLOCK_SIZE
    ---------- --------------- ----------
             0             646      16384
             0             646      16384
             1          121600       8192  --> different DATAFILE_BLOCKS for
             1          106240       8192  --> the same FILE#
             2           25600       8192
             3           61440       8192
             3           65280       8192
             4           26880       8192
             4            8320       8192
             5           51200       8192
             7             640       8192
             7             640       8192
             8            1288       8192
    
    13 rows selected.
    

    无论如何,回答您的问题:如何将您已经计算的总和除以值count(*) 返回?像这样的东西(见第 5 行)(我使用了你的查询):

    SQL> select file#,
      2         sum(datafile_blocks * 8 / 1024) sum_blk,
      3         count(*) cnt,
      4         --
      5         sum(datafile_blocks * 8 / 1024) / count(*) result
      6  from v$backup_datafile
      7  group by file#;
    
         FILE#    SUM_BLK        CNT     RESULT
    ---------- ---------- ---------- ----------
             1       1780          2        890
             7         10          2          5
             2        200          1        200
             8    10,0625          1    10,0625
             4        275          2      137,5
             5        400          1        400
             3        990          2        495
             0   10,09375          2   5,046875
    
    8 rows selected.
    
    SQL>
    

    【讨论】:

    • 有没有办法得到这些文件的最近副本的总和#?如果文件随时间增长,除以 count(*) 不会给出准确的文件大小。
    • 这就是为什么我问你是否真的想这样做。看起来 - 在您的数据库中 - 这些行看起来完全相同,因此您想要删除其中一个(在我的数据库中,它们是不同的)。为此,您只需将 SUM 除以 COUNT 并得到一个平均值,实际上是 - avg(datafile_blocks * 8 / 1024)
    • 如何在不显示单个大小的情况下汇总“结果”列总数?
    • 使用“this”查询作为子查询并从中选择 SUM(RESULT)。
    【解决方案2】:

    如果我做对了,您只需要每个文件的最后一条语句。你呢?

    在这种情况下,我建议这样:

    with 
        t as (
            select file#, 
                   datafile_blocks * 8 / 1024 sum_blk,
                   checkpoint_time,
                   row_number() over (
                             partition by file# 
                             order by checkpoint_time desc) desc_row_no 
              from  v$backup_datafile 
        )
    select * 
      from t 
     where desc_row_no = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-09
      • 2022-06-10
      • 2019-11-10
      • 1970-01-01
      • 2012-07-20
      • 2020-06-24
      • 2023-02-23
      • 2016-01-16
      相关资源
      最近更新 更多