查找在多家商店购物的客户
Find Customers Who Shop at Multiple Stores
我需要一个查询,以计算过去 3 年内在多个商店购物的顾客数量。
我制定了以下查询,但这不是我需要知道的:
SELECT STORE_ID, CUSTOMER_ID, COUNT(DISTINCT CUSTOMER_ID) as SERVICE_COUNT
From SALES INNER JOIN
STORE_DETAILS
ON trim(STORE_ID) = trim(STORE_ID)
WHERE (CURRENT_DATE - cast(SALE_DATE AS DATE format 'mm/dd/yyyy')) < 1095
ORDER BY 1,2
Group by 1,2
HAVING COUNT(DISTINCT SALE_DATE) > 1
如果您想要多个商店的客户,则类似:
SELECT CUSTOMER_ID
FROM SALES INNER JOIN
STORE_DETAILS
ON trim(STORE_ID) = trim(STORE_ID)
WHERE (CURRENT_DATE - cast(SALE_DATE AS DATE format 'mm/dd/yyyy')) < 1095
GROUP BY 1
HAVING COUNT(DISTINCT STORE_ID) > 1;
我不明白你的日期表达式,但想必你知道它应该做什么。
根据您的评论优化了 Gordon 查询的版本:
Often, the store_id has trailing spaces not allowing a true match
比较字符串会忽略尾随空格。只要没有前导空格(这是最坏的情况,应该在加载期间修复),您就不必 TRIM(这对性能非常不利)。
The datatype for SALE_DATE is DATE
如果是约会,则不需要 CAST。此外,可以简化 三年内 逻辑以避免对每一行进行日期计算。
SELECT CUSTOMER_ID, COUNT(DISTINCT CUSTOMER_ID) as SERVICE_COUNT
FROM SALES
JOIN STORE_DETAILS
ON STORE_ID = STORE_ID
WHERE SALE_DATE >= ADD_MONTHS(CURRENT_DATE, -12*3)
GROUP BY 1
HAVING SERVICE_COUNT > 1
;
我需要一个查询,以计算过去 3 年内在多个商店购物的顾客数量。
我制定了以下查询,但这不是我需要知道的:
SELECT STORE_ID, CUSTOMER_ID, COUNT(DISTINCT CUSTOMER_ID) as SERVICE_COUNT
From SALES INNER JOIN
STORE_DETAILS
ON trim(STORE_ID) = trim(STORE_ID)
WHERE (CURRENT_DATE - cast(SALE_DATE AS DATE format 'mm/dd/yyyy')) < 1095
ORDER BY 1,2
Group by 1,2
HAVING COUNT(DISTINCT SALE_DATE) > 1
如果您想要多个商店的客户,则类似:
SELECT CUSTOMER_ID
FROM SALES INNER JOIN
STORE_DETAILS
ON trim(STORE_ID) = trim(STORE_ID)
WHERE (CURRENT_DATE - cast(SALE_DATE AS DATE format 'mm/dd/yyyy')) < 1095
GROUP BY 1
HAVING COUNT(DISTINCT STORE_ID) > 1;
我不明白你的日期表达式,但想必你知道它应该做什么。
根据您的评论优化了 Gordon 查询的版本:
Often, the store_id has trailing spaces not allowing a true match
比较字符串会忽略尾随空格。只要没有前导空格(这是最坏的情况,应该在加载期间修复),您就不必 TRIM(这对性能非常不利)。
The datatype for SALE_DATE is DATE
如果是约会,则不需要 CAST。此外,可以简化 三年内 逻辑以避免对每一行进行日期计算。
SELECT CUSTOMER_ID, COUNT(DISTINCT CUSTOMER_ID) as SERVICE_COUNT
FROM SALES
JOIN STORE_DETAILS
ON STORE_ID = STORE_ID
WHERE SALE_DATE >= ADD_MONTHS(CURRENT_DATE, -12*3)
GROUP BY 1
HAVING SERVICE_COUNT > 1
;