排名多列(Teradata)

时间:2016-08-31 23:50:47

标签: teradata

问:有没有办法对单个列进行限定,而忽略最终报告输出中的其余列?

我不得不将此问题转移到仅限Teradata的会议,因为有一个SQL Server解决方案。

我的最终输出格式如下(没有排名限制):

PRODUCT1  STATE1  CITY_A  20
PRODUCT2  STATE1  CITY_A  10
PRODUCT3  STATE1  CITY_A  25

PRODUCT1  STATE1  CITY_B  20
PRODUCT2  STATE1  CITY_B  10
PRODUCT3  STATE1  CITY_B  1

PRODUCT1  STATE2  CITY_C  20
PRODUCT2  STATE2  CITY_C  10
PRODUCT3  STATE2  CITY_C  1

我正在试图解决一个问题,即如何通过动态SQL表达式来生成最高的2个总收益,*整体*。

期望的输出:

PRODUCT1  STATE1  CITY_A  20
PRODUCT2  STATE1  CITY_A  10

PRODUCT1  STATE1  CITY_B  20
PRODUCT2  STATE1  CITY_B  10

PRODUCT1  STATE2  CITY_C  20
PRODUCT2  STATE2  CITY_C  10

产品3不应符合RANKed< = 2 - 如果排名整体,而不是被州和城市打破。
我想看看是否可以在创建最终格式化输出的外部选择级别使用分析函数。

使用Teradata 14.00,因此无法访问DENSE_RANK ......

UPDATE:

Mr.ZLK建议使用非OLAP解决方案,该解决方案适用于SQL Server,但不适用于TD,不幸的是:

select * from products sqlMain 
where product_id in (1,2,3) /* dynamic pre-condition */ 

    and product_id in 
    (select top 2 product_id from products t1 
       where sqlMain.product_id=t1.product_id 
     group by product_id order by sum(total) desc 
    ) 

这将给出PRODUCT1和PRODUCT2

select * from products sqlMain 
where product_id in (3) /* another dynamic pre-condition */ 

    and product_id in 
    (select top 2 product_id from products t1 
       where sqlMain.product_id=t1.product_id 
     group by product_id order by sum(total) desc 
    ) 

这样可以正确地提供PRODUCT3。

1 个答案:

答案 0 :(得分:0)

如果您的Teradata版本高于14.10,则可以在DENSE_RANK子句中使用QUALIFY分析函数。

假设您的表格列为productstatecitygross,则可能是这样的:

SELECT
  product,
  state,
  city,
  gross
FROM (SELECT
        product,
        state,
        city,
        gross,
        SUM(gross) OVER(PARTITION BY product) AS total
      FROM yourTable) t
QUALIFY DENSE_RANK() OVER(ORDER BY total DESC) <= 2
;