【问题标题】:SQL max multiple columnsSQL max 多列
【发布时间】:2013-01-02 18:36:12
【问题描述】:

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

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 有点陌生,所以这是全新的领域。

【问题讨论】:

  • 你用的是什么数据库?
  • 对不起,我应该指定的。 Oracle 数据库 11g

标签: sql oracle max multiple-columns


【解决方案1】:

您的查询非常接近。不要使用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

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

【讨论】:

  • 好吧,这可能是我缺乏SQL经验,但我有点困惑。上面的代码给了我一个“这个函数缺少的窗口规范”。本质上,我想要的结果是显示每个 target_name 的列的最大值以及获取该值时的时间戳。但是,如果该值在 4 个不同的日子里处于最大值(例如 25 天),则它显示所有 4 天都处于该值。我希望它向我显示该目标的最大值,并且仅向我显示它在该值的最近一天...
  • @user1943674 @Gordon:row_number()) 中的小错误,需要删除括号。
【解决方案2】:

在窗口中使用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 ;

【讨论】:

  • 戈登在我面前给出了(几乎完全相同)相同的答案。
  • @bluefeet:另一个答案也有顺序,我只说具体(当最大值有关系时)
猜你喜欢
  • 2010-09-09
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多