2017-10-11 1138 views
0

你好嗎?如何在teradata中使用Qualify 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 

但結果是:「在表中沒有可用的數據」。

我想要得到更多shp_shipment_id的前3個sit_site_id值。

我的錯誤在哪裏?

謝謝!

+1

GROUP BY按每個site_id返回一行,然後嘗試獲取第三行,當然不返回任何行。你可能想要像'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值,那麼你就需要使用RANK()/ ROW_NUMBER()。相反,你可以使用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更喜歡TOP? – dnoeth

+0

@dnoeth。 。 。 (1)我沒有看到需要從'order by'單獨計算行號。他們有相同的執行計劃嗎? (2)我真的*更喜歡'第一次獲取',因爲那是ANSI標準。 –

+0

* top-n-rows *有一些通用優化,因此這兩個變體都是相同的計劃。我通常不推薦TOP,因爲語法只允許排列功能的一個子集(並且每當我閱讀TOP時,我必須跳到查詢的末尾以查看是否有ORDER BY)。 – dnoeth

相關問題