【问题标题】:RANK against multiple columns (Teradata)针对多个列进行排名 (Teradata)
【发布时间】:2016-09-09 06:02:15
【问题描述】:

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

我不得不将此问题转移到仅 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 不应该有资格获得排名 我想看看是否可以在创建最终格式化输出的外部选择级别使用分析函数。

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

更新:

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。

【问题讨论】:

  • 您确定那些 SQL Server 查询返回正确的结果吗?恕我直言,那些相关子查询不会改变结果,您只需获得与第一个 WHERE product_id in (...) 匹配的所有行
  • 子查询是有序的,因此返回的前 2 个值将是排名最高的;查看内联选择的 where 子句
  • Where 子句将子查询限制在外部 product_id 的范围内,“排名”的 ID 永远不会超过一个。这符合您的描述:select * from products sqlMain where product_id in (select top 2 product_id from products t1 product_id in (1,2,3) /* dynamic pre-condition */ group by product_id order by sum(total) desc )。当您切换到联接时,您也可以在 Teradata 中使用它(或使用 QUALIFY RANK() OVER (order by sum(total) desc )<=2
  • 我不同意。第一个示例中的 sqlMain 生成 3 个 product_id,然后将它们连接到外部 where 子句中,在 top & order 子句之前 - 因此生成 product_id 1,2 响应。在第二个示例中,仅融合了 product_id 3,因此外部 SQL 仅返回一个最高值 3。在 SQL Server 中对此进行了测试。不能在 Teradata 中做同样的事情,因为它不允许内联视图中的 order 和 top。将测试您的其他提案并在此处发布,谢谢!

标签: teradata


【解决方案1】:

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

假设您的表格的列是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
; 

【讨论】:

  • 我知道!我在 14.00,无赖。对于dense_rank,我必须使用双头解决方法,对于需要嵌入两次的大量报告SQL,它看起来不像是一个简洁的解决方案。在我的例子中,“yourTable”是一个 4 层高的 SQL 表达式。但我也会试试这个..
  • 如果您找到了方法,请告诉我们!也许您应该编辑您的问题,以包括 Teradata 版本和其他对未来帮助者的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多