跨多种产品获得独特客户数的最佳方法

时间:2019-03-28 09:20:36

标签: amazon-athena presto

使用AWS Athena,我正在尝试编写查询以获取对每种产品订购的唯一客户数量的计数。

如果客户订购了5次产品,我只希望他们将指定产品计为1。虽然我希望他们订购的其他3种具有不同SKU代码的产品也能算在内。问题是我们的产品标题随着时间的推移而变化,当我运行以下查询时,由于产品标题的更改,我按产品标题获得的结果带有多次列出的sku代码,但希望按sku_code唯一的客户计数。

SELECT product_title, product_code, COUNT(DISTINCT customer_reference_id)
FROM "business_usage"."daily_business_usage_by_instance_type"
GROUP BY product_title, product_code
ORDER BY Product_code

这是我尝试获取的每个sku购买的客户的不同计数但获得Syntax_error:函数值意外参数(varchar,varchar)的查询。预期:第一行的count(),count(T)T

SELECT product_name, COUNT(DISTINCT sku_code, customer_id)
FROM "Data"."Orders"
GROUP BY product_name, sku_code
ORDER BY sku_code

关于我在做什么错的任何想法,或者这是否是获取我所需信息的正确查询?

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您希望按SKU来确定唯一身份客户的数量,但您也想检索产品名称,该产品名称随时间而变化,尽管与SKU没有一对一关系。

一种实现此目的的方法是按SKU分组并使用ARBITRARY聚合函数从分组中选择一个产品标题:

SELECT
  ARBITRARY(product_title) AS product_title,
  product_code,
  COUNT(DISTINCT customer_reference_id)
FROM "business_usage"."daily_business_usage_by_instance_type"
GROUP BY product_code
ORDER BY product_code

顾名思义,ARBITRARY将为您提供一个值,但是并没有定义哪个值,并且每次运行可能会有所不同。您还可以使用MINMAX来获得字母的第一个和最后一个。

在某些情况下,您可能想以一种更特定的方式来选择商品标题,例如时间戳最高的那一行。假设表中有一个名为order_date的列,则可以使用MAX_BY函数从组中的最新行中选择产品标题:

SELECT
  MAX_BY(product_title, order_date) AS product_title,
  product_code,
  COUNT(DISTINCT customer_reference_id)
FROM "business_usage"."daily_business_usage_by_instance_type"
GROUP BY product_code
ORDER BY product_code