Лучший способ получить уникальное количество клиентов для нескольких продуктов

#amazon-athena #presto

#amazon-athena #presto

Вопрос:

Используя AWS Athena, я пытаюсь написать запрос, чтобы получить подсчет количества уникальных клиентов, которые заказали каждый продукт.

Если клиент заказал продукт 5 раз, я хочу, чтобы они учитывались как 1 только для указанного продукта. Хотя я хочу, чтобы они учитывались, если они заказали 3 других продукта с разными кодами артикула. Проблема в том, что названия наших продуктов со временем менялись, и когда я запускаю следующий запрос, я получаю результаты по названию продукта с кодом 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
  

Это запрос, с помощью которого я пытался получить четкое количество клиентов для каждого приобретенного артикула, но получаю 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. Привет, Бриттани. Вы пробовали группировать по sku_code и customer_id? Если product_name — это значение, которое потенциально может меняться со временем, возможно, использовать его не стоит :). Пожалуйста, попробуйте и прокомментируйте результаты. С уважением

Ответ №1:

Если я вас правильно понимаю, вам нужно количество уникальных клиентов по артикулу, но вы также хотите получить название продукта, которое со временем изменилось и, хотя связано с артикулом, не имеет однозначного отношения.

Один из способов добиться этого — сгруппировать по артикулу и использовать 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 даст вам значение, но не определено, какое именно, и оно может варьироваться от запуска к запуску. Вы также можете использовать MIN или MAX для получения первого и последнего в алфавитном порядке.

Возможно, вы хотите выбрать название продукта более конкретным способом, например, из строки с наибольшей временной меткой. Предполагая, что в вашей таблице есть столбец с именем 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