2017-10-11 29 views
0

どうですか?テラデータのrow_numberを修飾する方法

私は決してrow_number()/ rank()を使用したことがなく、いくつか質問があります。

私は、Teradataの中でこのクエリをしようとしています:

select sit_site_id 
    , count(distinct shp_shipment_id) 
from WHOWNER.BT_SHP_SHIPMENTS 
group by sit_site_id 
QUALIFY RANK() OVER (PARTITION BY sit_site_id 
        ORDER BY count(distinct shp_shipment_id)) = 3 

をしかし、結果は次のとおりです。「テーブル内のデータなし」。

最初の3つのsit_site_id値をより多くのshp_shipment_idで取得したいと考えています。

ここで私のエラー

ありがとうございます!

+1

GROUP BYはsite_idごとに1つの行を返します.3行目を取得しようとすると、もちろん行が返されません。おそらく、3つの最も高いカウントを返す 'QUALIFY RANK()OVER( ORDER BY count(distinct shp_shipment_id))<= 3'のようなものがほしいでしょう。 – dnoeth

+0

各 'shipment_id 'ごとに上位3つの' site_id'が必要ですか?サンプルデータと所望の出力を親切に共有する。 – zarruq

答えて

1

私がもしそうなら、よりshp_shipment_id

で最初の3つのsit_site_id値を取得したい、あなたは()/ ROW_NUMBER()RANKを使用する必要はありません。代わりに、単にTOPを使うことができます。あなたのクエリは以下のようにする必要があります:

select TOP 3 sit_site_id 
    , count(distinct shp_shipment_id) shp_shipment_id_cnt 
from WHOWNER.BT_SHP_SHIPMENTS 
group by sit_site_id 
order by shp_shipment_id_cnt DESC; 
0

あなたはこのためqualifyを使用する場合は、あなたが行うことができます:

select sit_site_id, count(distinct shp_shipment_id) 
from WHOWNER.BT_SHP_SHIPMENTS 
group by sit_site_id 
qualify row_number() over (order by count(distinct shp_shipment_id) desc) <= 3; 

しかし、私はクラークの答え@のようにtopをお勧めします。

+0

なぜTOPをQUALIFYよりも優先しますか? – dnoeth

+0

@dnoeth。 。 。 (1)行番号を 'order by'とは別に計算する必要はありません。彼らは同じ実行計画を持っていますか? (2)これはANSI標準であるため、私は実際に*フェッチファーストを好む。 –

+0

* top-n-rows *にはいくつかの一般的な最適化があります。したがって、両方のバリエーションで同じ計画です。私は通常TOPを推奨していません。なぜなら、構文がランキング機能のサブセットのみを許可するからです(そして、TOPを読んでいる間は、ORDER BYがあるかどうかを調べるためにクエリの最後までスキップする必要があります)。 – dnoeth

関連する問題