首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigQuery --如何创建计算包含新列本身的新列?

BigQuery --如何创建计算包含新列本身的新列?
EN

Stack Overflow用户
提问于 2016-07-28 04:03:15
回答 2查看 3.5K关注 0票数 2

-总结-

我有三列: visitorID,排名,数字。

在BigQuery中,我想创建一个新的列计算,它是数字之和和计算本身的一部分,包括指定的条件。

我现在遇到的问题是,“在BigQuery中,我不能创建一个需要计算的列,包括我正在创建的列”。我不知道我的概念或想法是否合适,我希望有更好的建议。

--细节--

*我拥有的表:

有三列的表: visitorID,秩,数字。

*我需要创建的新列:

需要创建列计算。

*计算的定义:

按visitorID和秩排序后,计算如下:

(i)如果数字= 0,则如果数字为<> 0,则计算=0 (ii),然后将当前数字值和以前的计算编号相加。(iii)基于(ii)项,如求和大于30,则计算= 0,否则计算仍维持相同的求和值。

参见下面的示例。

*我遇到的问题

我需要用BigQuery来做这种计算。然而,我想出的是“窗口和函数”,这似乎不是一个很好的解决方案。我认为关键是“在BigQuery中,我不能创建一个需要计算的列,包括我正在创建的列”。

参见下面的示例。

也就是说,我总是需要现有的值来创建一个新的列。我有我的示例查询如下,这不能解决问题。你也可以看到打印屏幕来了解问题所在。

请参见下面的示例查询。

代码语言:javascript
复制
SELECT 
  visitorID, 
  rank, 
  numbers, 
  SUM(numbers) OVER (PARTITION BY visitorID ORDER BY rank) AS window_sum_current, 
  SUM(numbers) OVER (PARTITION BY visitorID ORDER BY rank ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS window_sum_prec1     
FROM sample_table

*寻求建议

我想征求大家的意见。(1)在BigQuery中,这个问题是否可以解决?(2)我缺乏什么方法或概念?(3)在BigQuery中解决问题的更好方法是什么?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-28 05:25:18

对于BigQuery,到目前为止我能提出的唯一解决方案如下

它产生了确切的结果,你期望的价格,让你了解一点关于BigQuery用户定义函数。非常强大的功能,如果使用得当。在某些情况下,它存在内存问题,很快将由每个此链接来解决。

我强烈建议采用这个特性!

代码语言:javascript
复制
SELECT visitorID, rank, numbers, calculation FROM JS(
// input table
( SELECT visitorID, 
    GROUP_CONCAT(CONCAT(STRING(100000 + rank), ',', STRING(numbers)), ';') AS list
  FROM
    (SELECT 1001 AS visitorID, 1 AS rank, 0 AS numbers), 
    (SELECT 1001 AS visitorID, 2 AS rank, 13 AS numbers), 
    (SELECT 1001 AS visitorID, 3 AS rank, 13 AS numbers), 
    (SELECT 1001 AS visitorID, 4 AS rank, 6 AS numbers), 
    (SELECT 1001 AS visitorID, 5 AS rank, 4 AS numbers), 
    (SELECT 1001 AS visitorID, 6 AS rank, 5 AS numbers), 
    (SELECT 1001 AS visitorID, 7 AS rank, 26 AS numbers), 
    (SELECT 1001 AS visitorID, 8 AS rank, 32 AS numbers), 
    (SELECT 999 AS visitorID, 1 AS rank, 0 AS numbers), 
    (SELECT 999 AS visitorID, 2 AS rank, 2 AS numbers), 
    (SELECT 999 AS visitorID, 3 AS rank, 2 AS numbers), 
    (SELECT 999 AS visitorID, 4 AS rank, 2 AS numbers), 
    (SELECT 999 AS visitorID, 5 AS rank, 2 AS numbers), 
    (SELECT 999 AS visitorID, 6 AS rank, 24 AS numbers) 
  GROUP BY visitorID
),
// input columns
visitorID, list,
// output schema
"[{name: 'visitorID', type: 'integer'},
{name: 'rank', type: 'integer'},
{name: 'numbers', type: 'integer'},
{name: 'calculation', type: 'integer'}]",
// function
"function(r, emit){
  var list = r.list.split(';');
  list.sort();
  calculation = 0;
  for (var i = 0; i < list.length; i++) {
    rank = parseInt(list[i].split(',')[0]) - 100000;
    numbers = parseInt(list[i].split(',')[1]);
    if (numbers !== 0) calculation += numbers;
    if (calculation > 30) calculation = 0;
    emit({visitorID: r.visitorID, rank: rank, 
          numbers: numbers, calculation: calculation});
  }
 }"
)
票数 2
EN

Stack Overflow用户

发布于 2016-07-28 20:25:01

在Select语句中,您要做的事情是不可能的。您要求做的事情本质上需要变量、循环和if语句,这些语句在Select语句中是不可用的。

当然,您可以使用表值函数和存储过程在SQL代码中执行此类操作。使用一种为您想要做的事情而构建的外部编程语言可能是您最简单的方法。

在SQL中运行对visitorID、秩、数字的查询,然后在输出到任何需要的文件或屏幕时只开发计算数据。

希望它能澄清你的处境。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38626901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档