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を調整したり、これに関数を制限したりする方法はありますか?私はSQLに少し慣れていないので、これはすべて新しい領域です。

4

2 に答える 2

5

あなたの質問はとても近いです。を実行する代わりにmaxrow_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

これにより、パーティション内のすべてが値順に並べられます。最大の値が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 に答える