#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