Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 列向量和导出位向量的加权和_Google Bigquery_Bigquery Standard Sql - Fatal编程技术网

Google bigquery 列向量和导出位向量的加权和

Google bigquery 列向量和导出位向量的加权和,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,我们有两位买家的投标价格和规模表。大小为s的投标价格p表示买方愿意以p的价格购买s数量的产品。我们有一个由四列组成的表: pA和pB两个买方提供的投标价格 投标尺寸,sA和sB 我们的工作是向表中添加一个新的最佳大小列(bS),该列以最佳价格返回大小。如果两个买家的价格相同,那么bS等于sA+sB,否则,我们需要采用出价较高的买家的出价大小 下面是具有所需输出的示例表 此问题的简单解决方案: SELECT pA, pB, sA, sB, CASE WHEN pA = pB THE

我们有两位买家的投标价格和规模表。大小为s的投标价格p表示买方愿意以p的价格购买s数量的产品。我们有一个由四列组成的表:

  • pA和pB两个买方提供的投标价格
  • 投标尺寸,sA和sB
我们的工作是向表中添加一个新的最佳大小列(bS),该列以最佳价格返回大小。如果两个买家的价格相同,那么bS等于sA+sB,否则,我们需要采用出价较高的买家的出价大小

下面是具有所需输出的示例表

此问题的简单解决方案:

SELECT pA, pB, sA, sB,
  CASE
    WHEN pA = pB THEN sA + sB
    WHEN pA > pB THEN sA
    ELSE sB
  END AS bS
FROM t
现在让我们把这个问题推广到四个买主身上。标准的SQL解决方案是

WITH t_ext AS (
SELECT *, GREATEST(pA, pB, pC, pD) as bestPrice
FROM `t` 
)
SELECT *, (sA * CAST(pA = bestPrice AS INT64) + 
           sB * CAST(pB = bestPrice AS INT64) + 
           sC * CAST(pC = bestPrice AS INT64) +
           sD * CAST(pD = bestPrice AS INT64)) 
AS bS FROM t_ext
问题1)

有没有一个简化的查询

  • 使用函数SUM而不是手动添加四项
  • 避免重复铸造
问题2)

在Google BigQuery生态系统中,是否有办法将此查询重新用于另一个具有列名的表,例如priceA、priceB而不是pA、pB


顺便说一句,我写了一篇关于这个问题的文章,重点是Python和Q中的解决方案,我想知道标准sql中的最佳解决方案是什么样子的。

下面是针对BigQuery标准sql的,它是一个不通用的工具,不依赖于买家的数量以及价格和大小字段的命名。唯一的期望是所有的价格都先到,然后是所有的尺寸,就像你的例子一样。此外,我假设所有数字都是整数(如所讨论的示例),但这可以调整以处理浮点

#standardSQL
WITH t_ext AS (
  SELECT * EXCEPT(arr), 
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS prices,
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET >= 4) AS sizes,
    (SELECT MAX(CAST(val AS INT64)) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS bestPrice
  FROM (
    SELECT *, REGEXP_EXTRACT_ALL(TO_JSON_STRING(T), r':(\d+)') AS arr
    FROM `project.dataset.table` t
  )
)
SELECT * EXCEPT(prices, sizes), 
  (SELECT SUM(size)
    FROM UNNEST(prices) price WITH OFFSET
    JOIN UNNEST(sizes) size WITH OFFSET
    USING(OFFSET) 
    WHERE price = bestPrice
  ) AS bS
FROM t_ext  
例如,对于以下虚拟数据(4个买家)


以下是BigQuery标准SQL的一种非通用性,它不依赖于买家的数量以及价格和大小字段的命名。唯一的期望是所有的价格都先到,然后是所有的尺寸,就像你的例子一样。此外,我假设所有数字都是整数(如所讨论的示例),但这可以调整以处理浮点

#standardSQL
WITH t_ext AS (
  SELECT * EXCEPT(arr), 
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS prices,
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET >= 4) AS sizes,
    (SELECT MAX(CAST(val AS INT64)) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS bestPrice
  FROM (
    SELECT *, REGEXP_EXTRACT_ALL(TO_JSON_STRING(T), r':(\d+)') AS arr
    FROM `project.dataset.table` t
  )
)
SELECT * EXCEPT(prices, sizes), 
  (SELECT SUM(size)
    FROM UNNEST(prices) price WITH OFFSET
    JOIN UNNEST(sizes) size WITH OFFSET
    USING(OFFSET) 
    WHERE price = bestPrice
  ) AS bS
FROM t_ext  
例如,对于以下虚拟数据(4个买家)


谢谢米哈伊尔,这很有用。我想知道如何更改查询,使其只考虑价格和大小列。让我们假设还有其他列(如事务ID、事务时间等)也可以存储整数。我的输出应该是原始表,扩展了bestPrice和bestSize(bS)列。我回答了您最初的问题。考虑投票并接受它。如果您有新问题-请将其作为新问题发布,我们也很乐意回答,因为无法在评论中跟进其他问题。确保您提供了输入和所需输出的相关细节Hanks Mikhail,这非常有用。我想知道如何更改查询,使其只考虑价格和大小列。让我们假设还有其他列(如事务ID、事务时间等)也可以存储整数。我的输出应该是原始表,扩展了bestPrice和bestSize(bS)列。我回答了您最初的问题。考虑投票并接受它。如果您有新问题-请将其作为新问题发布,我们也很乐意回答,因为无法在评论中跟进其他问题。确保您提供了相关的详细信息以及输入和所需输出的示例
#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 pA, 2 pB, 3 pC, 4 pD, 1 sA, 1 sB, 1 sC, 5 sD UNION ALL
  SELECT 1, 4, 2, 4, 1, 6, 1, 5 UNION ALL
  SELECT 4, 4, 2, 1, 7, 1, 1, 1
), t_ext AS (
  SELECT * EXCEPT(arr), 
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS prices,
    ARRAY(SELECT CAST(val AS INT64) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET >= 4) AS sizes,
    (SELECT MAX(CAST(val AS INT64)) FROM UNNEST(arr) val WITH OFFSET WHERE OFFSET < 4) AS bestPrice
  FROM (
    SELECT *, REGEXP_EXTRACT_ALL(TO_JSON_STRING(T), r':(\d+)') AS arr
    FROM `project.dataset.table` t
  )
)
SELECT * EXCEPT(prices, sizes), 
  (SELECT SUM(size)
    FROM UNNEST(prices) price WITH OFFSET
    JOIN UNNEST(sizes) size WITH OFFSET
    USING(OFFSET) 
    WHERE price = bestPrice
  ) AS bS
FROM t_ext
Row pA  pB  pC  pD  sA  sB  sC  sD  bestPrice   bS   
1   1   2   3   4   1   1   1   5   4           5    
2   1   4   2   4   1   6   1   5   4           11   
3   4   4   2   1   7   1   1   1   4           8