Sql 通过首次使用特定产品进行分区
我试图从我们的账单数据库中生成一个表,列出月份、帐户和产品名称。然而,我还想了解在后续的队列分析中,每个行项目最早使用产品A的情况。我希望我能做到以下几点: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
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。是的!我认为这很有效,谢谢。你介意快速解释一下双分钟吗?