Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Sql 通过首次使用特定产品进行分区_Sql_Google Bigquery_Partitioning - Fatal编程技术网

Sql 通过首次使用特定产品进行分区

Sql 通过首次使用特定产品进行分区,sql,google-bigquery,partitioning,Sql,Google Bigquery,Partitioning,我试图从我们的账单数据库中生成一个表,列出月份、帐户和产品名称。然而,我还想了解在后续的队列分析中,每个行项目最早使用产品A的情况。我希望我能做到以下几点: SELECT Month, AccountID, ProductName, SUM(NetRevenue) AS NetRevenue, MIN(Month) OVER(PARTITION BY AccountID, 'Product A') AS EarliestUse FROM <<my-bill

我试图从我们的账单数据库中生成一个表,列出月份、帐户和产品名称。然而,我还想了解在后续的队列分析中,每个行项目最早使用产品A的情况。我希望我能做到以下几点:

SELECT 
  Month,
  AccountID,
  ProductName,
  SUM(NetRevenue) AS NetRevenue,
  MIN(Month) OVER(PARTITION BY AccountID, 'Product A') AS EarliestUse 
FROM
  <<my-billing-table>>
WHERE
  NetRevenue > 0
  AND AccountID IN (
      SELECT DISTINCT AccountID
      FROM <<my-billing-table>>
      WHERE ProductName = 'Product A' AND NetRevenue > 0
    )
GROUP BY 1,2,3
…但似乎仅在OVER子句中使用产品A并没有达到预期效果—它似乎只是返回AccountID的第一个月


虽然语法很好,查询也在运行,但我显然缺少了一些关于OVER子句分区的内容。非常感谢任何帮助

我认为您需要条件聚合和窗口函数:

SELECT Month, AccountID, ProductName,
       SUM(NetRevenue) AS NetRevenue,
       MIN(MIN(CASE WHEN ProductName = 'Product A' THEN month END)) OVER (PARTITION BY AccountID) AS EarliestUse 
FROM <<my-billing-table>>
WHERE NetRevenue > 0 AND
      AccountID IN (SELECT AccountID
                    FROM <<my-billing-table>>
                    WHERE ProductName = 'Product A' AND NetRevenue > 0
                   )
GROUP BY 1,2,3;
这里的关键表达式是嵌套在窗口函数中的聚合函数。当ProductName='Product A'然后是月末时,聚合函数为MINCASE。这将计算每行上指定产品的最早月份。这可能是结果集中的一列,您将在产品行中看到最小值


然后,window函数将该值分布到给定AccountID的所有行。

如果在分区中使用常数,则不会影响结果,应使用分区中的列ProductName以获得产品的最早使用

SELECT 
  Month,
  AccountID,
  ProductName,
  SUM(NetRevenue) AS NetRevenue,
  MIN(Month) OVER(PARTITION BY AccountID, ProductName) AS EarliestUse
FROM
  <<my-billing-table>>
WHERE
  NetRevenue > 0
  AND AccountID IN (
      SELECT DISTINCT AccountID
      FROM <<my-billing-table>>
      WHERE ProductName = 'Product A' AND NetRevenue > 0
    )
GROUP BY 1,2,3


我认为这不会起作用,因为它会为每行项目生成产品名称的最早使用日期,即对于产品B,它会显示产品B的最早使用日期,而不是产品A。是的!我认为这很有效,谢谢。你介意快速解释一下双分钟吗?