2017-10-11 502 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