不同的别名为完全相同的查询生成不同的结果

时间:2016-04-21 21:46:05

标签: google-bigquery

同一个完全查询的两个版本

  

版本1(在内部SELECT中使用k作为别名):

SELECT k, w_vol, 
  ROW_NUMBER() OVER (ORDER BY k DESC) AS rank1,
  ROW_NUMBER() OVER (ORDER BY w_vol DESC) AS rank2
FROM (
  SELECT w_vol, c_date AS k FROM 
    (SELECT 1590 AS c_date, 1 AS w_vol),
    (SELECT 1599 AS c_date, 1 AS w_vol),
    (SELECT 1602 AS c_date, 1 AS w_vol),
    (SELECT 1609 AS c_date, 2 AS w_vol),
    (SELECT 1610 AS c_date, 1 AS w_vol),
)
ORDER BY 1
  

版本2(在内部SELECT中使用l作为别名):

SELECT l, w_vol, 
  ROW_NUMBER() OVER (ORDER BY l DESC) AS rank1,
  ROW_NUMBER() OVER (ORDER BY w_vol DESC) AS rank2
FROM (
  SELECT w_vol, c_date AS l FROM 
    (SELECT 1590 AS c_date, 1 AS w_vol),
    (SELECT 1599 AS c_date, 1 AS w_vol),
    (SELECT 1602 AS c_date, 1 AS w_vol),
    (SELECT 1609 AS c_date, 2 AS w_vol),
    (SELECT 1610 AS c_date, 1 AS w_vol),
)
ORDER BY 1 

以下是输出我一直得到两个查询(使用注释No Cached Results

enter image description here

我没有理解为什么会产生这个或那个结果的问题(这是相对微不足道的) - 但是 - 无论使用什么别名,我都期望结果是相同的 - 它只是别名!

  

问题:为什么我一直为版本1获得一个结果,为版本2获得另一个结果?

注意:我对如何以不同方式重新编写查询的建议不感兴趣"隐藏"问题!请不要打扰这个方向的答案!

Forgot to mention:

大多数别名产生与' l'相同的结果,但很少与' k'一样。另一个例子是' x'。只是想说清楚 - 这不仅仅是一个有问题的别名。甚至更多 - 有问题的别名取决于fileds的名称。

所以我认为这是涉及字段/别名名称的一些哈希问题 - 但这只是我的猜测!

1 个答案:

答案 0 :(得分:2)

我没有对该行为的具体解释,但请注意两个结果仍然正确:结果之间的唯一区别是在排序多个行时选择了不同的顺序要排序的列的相同值(1)(w_vol)。

一般来说,在将ORDER BY应用于相等值时,BigQuery不承诺任何特定排序,并且出于任何原因,排序可能因同一查询的不同执行而有所不同。

我同意有趣的是,排序似乎取决于别名,但我可以看到为什么会发生这种情况的大量合理解释 - 例如,引擎可能会迭代使用分析函数的字段列表,并且更改别名可能会更改评估这些分析函数的顺序,这反过来会在按一列排序时更改具有相等值的行的顺序。