【发布时间】: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