1

我正在尝试显示特定值的最大值,以及该值的相应时间戳。我的命令正常工作,但不幸的是,如果该值在超过一个时间段内处于最大值,它会显示所有时间戳。这对于多个目标也可能很麻烦。这是我现在使用的:

select target_name,value,collection_timestamp 
from (select target_name,value,collection_timestamp,
             max(value) over (partition by target_name) max_value
      from mgmt$metric_details 
      where target_type='host' and metric_name='TotalDiskUsage' 
        and column_label='Total Disk Utilized (%) (across all local filesystems)'
     )
where value=max_value;

我想使用相同类型的命令(由于带宽不足,试图避免内部连接等)....但每个 target_name 只显示 1 个最大值/时间戳。有没有办法在不破坏它的情况下将 group by 或 limit 函数协调到其中?我对 SQL 有点陌生,所以这是全新的领域。

4

2 回答 2

5

你的查询是如此接近。而不是做的max,做一个row_number()

select target_name,value,collection_timestamp 
from (select target_name,value,collection_timestamp,
             row_number() over (partition by target_name order by value desc) as seqnum
      from mgmt$metric_details 
      where target_type='host' and metric_name='TotalDiskUsage' 
        and column_label='Total Disk Utilized (%) (across all local filesystems)'
     )
where seqnum = 1

这会按值对分区中的所有内容进行排序。您想要一个最大值,因此按降序排列并取序列中的第一个。

于 2013-01-02T18:41:02.663 回答
3

在窗口中使用ROW_NUMBER()函数而不是MAX()适当ORDER BY的来解决关系:

select target_name,value,collection_timestamp 
from (select target_name,value,collection_timestamp,
             ROW_NUMBER() OVER (partition by target_name
                                ORDER BY value DESC, 
                                         collection_timestamp DESC )
                 AS rn
      from mgmt$metric_details 
      where target_type='host' and metric_name='TotalDiskUsage' 
        and column_label='Total Disk Utilized (%) (across all local filesystems)'
     )
where rn = 1 ;
于 2013-01-02T18:44:15.203 回答