Лучший способ получить уникальное количество клиентов по нескольким продуктам - PullRequest
0 голосов
/ 28 марта 2019

Использование 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

Это запрос, который я пытался получить для каждого покупателя, для которого определено количество клиентов, определенное количество, но получен 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 голосов
/ 31 марта 2019

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