1

我目前正在对运行查询需要很长时间的旧工作进行故障排除。旧作业使用第一个查询,但我一直在使用第二个查询进行测试。

之间的差异:

Select Max(Cl1) as Tab,
       Max(Cl2) as Tb,
       Customer
From TableA
group by Customer

对比

Select Customer,
       Tab,
       tb
From 
(Select Customer,
         Tab,
         tb,
         Rank() over (partition by Customer order by Cl1 desc) rk1,
         Rank() over (partition by Customer order by Cl2 desc) rk2
  From TableA) X
 Where X.rk1 = 1 and X.rk2 = 1

Tab Tb 客户

A45845 100052 新

A45845 100053 新

A45845 100054 恶臭

该表将始终具有 Tab 和 Tb 列的值(无空值或空白值)。选项卡不是特定客户独有的。Tb 是一个连续且连续递增的整数,不可能有重复(唯一)。客户的最新 Tab 值也将具有最新的 Tb。

虽然结果相同,但在这种情况下更改查询时我可能没有考虑到什么?

编辑:修复了构建示例而不使用真实列或表名时第二个查询的错误。还对场景进行了说明。我对原始帖子中的更新信息和修复表示歉意,甚至在我有机会仔细检查之前就打电话给我。

4

3 回答 3

0

第一个查询返回 and 的值TabTb第二个查询总是为两列返回 1 和 1(因为where子句)。

第二个只会返回存在 CL1 和 Cl2 的第一行的客户。第一个为所有客户返回一行。

当多行满足给定客户的两个订购条件时,第二个将返回重复项。第一个只返回每个客户一行。

第二个有语法错误,所以它不会运行(后面的逗号rk2)。第一个似乎是有效的 SQL 语法。

第一个似乎更简单,更容易理解。但是,我认为我的第一点是最大的不同。(我忽略了列的顺序不同的事实。)

于 2013-01-16T15:28:53.097 回答
0

这将是等效查询,但我怀疑它会更有效。@Damien_The_Unbeliever 如果我又错了,请告诉我。(为有多个具有相同值的 Cl1 和 Cl2 行的场景添加了不同的内容。如果主键跨客户、Cl1 和 Cl2,则可以删除。)

Select  Distinct Customer,
        X.Cl1 as Tab,
        X2.Cl2 as tb
From   (Select  Customer,
                Rank() over (partition by Customer order by Cl1 desc) rk1, 
                Cl1
        From    TableA) X
Join   (Select  Customer,         
                Rank() over (partition by Customer order by Cl2 desc) rk2, 
                Cl2
        From    TableA) X2
        On  X.Customer = X2.Customer
Where   X.rk1 = 1 
And     X2.rk2 = 1
于 2013-01-16T15:37:10.133 回答
0

严重怀疑Rank会更快。

如果您想要 CL1 最大的行上的 CL2 的值,则需要排名。

您有关于 Customer、CL1 和 CL2 的索引吗?
检查碎片。
检查执行计划。

而且这些都不会返回相同的结果。

于 2013-01-16T17:11:59.753 回答