查找在多家商店购物的顾客

时间:2020-07-17 11:31:13

标签: sql teradata

我需要一个查询,该查询将为我提供过去三年内在多个商店位置购物的客户数量。

我已经制定了以下查询,但这不是我需要知道的:

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

2 个答案:

答案 0 :(得分:0)

如果要在多个商店都有顾客,则类似:

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;

我不理解您的日期表达式,但想必您知道它应该在做什么。

答案 1 :(得分:0)

基于您的评论的Gordon查询的优化版本:

通常,store_id的尾部空格不允许真正匹配

比较字符串会忽略尾随空格。只要没有前导空格(这是最坏的情况,应该在加载期间固定),就不必进行TRIM(对于性能而言是相当糟糕的)。

SALE_DATE的数据类型为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
;
相关问题