Google bigquery 列向量和导出位向量的加权和
我们有两位买家的投标价格和规模表。大小为s的投标价格p表示买方愿意以p的价格购买s数量的产品。我们有一个由四列组成的表: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
- pA和pB两个买方提供的投标价格
- 投标尺寸,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而不是手动添加四项
- 避免重复铸造
顺便说一句,我写了一篇关于这个问题的文章,重点是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