首页 > 解决方案 > 在多种产品中获得唯一客户数量的最佳方式

问题描述

使用 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:Unexpected parameters (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

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

标签: amazon-athenapresto

解决方案


如果我理解正确,您想要按 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会给你一个值,但它没有定义哪个,它可能因运行而异。您还可以使用MINorMAX来获取按字母顺序排列的第一个和最后一个。

您可能希望以更具体的方式选择产品标题,例如时间戳最高的行中的标题。假设您的表有一个名为的列,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

推荐阅读