如果不包含所需日期,您如何过滤掉结果子集?

How do you filter out out a subset of results if it does not contain a desired date?

我正在从 MySQL 服务器中提取数据并执行分析以捕获与滚动平均值相差两个标准差的客户量。但是,我不关心在感兴趣的日期对没有任何客户量的商店执行此分析。在这种情况下,最大日期。

是否可以过滤掉在 SQL 的所需日期没有任何数量的 StoreId?

我的查询如下所示:

SELECT CAST(DATE AS DATE), StoreId, COUNT(CustomerId) AS Customer_Volume
FROM CustomerTable
WHERE 1=1
      AND DATE >= DATEADD(DAY, -5, GETDATE())
GROUP BY StoreId, CAST(DATE AS DATE)
ORDER BY 2,1

数据如下:

Date       | StoreId | Customer_Volume
---------------------------------
2020-01-18 |     7   |    10
2020-01-19 |     7   |     8
2020-01-20 |     7   |     8
2020-01-21 |     7   |    12
2020-01-18 |    11   |     4
2020-01-19 |    11   |     2

所以我想知道在这个例子中是否有办法过滤掉 StoreId = 11。

您可以使用 customer_volume

进行过滤
SELECT CAST(DATE AS DATE), StoreId, case when COUNT(CustomerId) AS Customer_Volume
FROM CustomerTable
WHERE 1=1
      AND DATE >= DATEADD(DAY, -5, GETDATE())
GROUP BY StoreId, CAST(DATE AS DATE)
having COUNT(CustomerId)> 0
ORDER BY 2,1

Window函数是一种方法:

SELECT CAST(DATE AS DATE), StoreId, COUNT(CustomerId) AS Customer_Volume
FROM CustomerTable
WHERE DATE >= DATEADD(DAY, -5, GETDATE()) AND
      EXISTS (SELECT 1
              FROM CustomerTable ct
              WHERE ct2.StoreId = ct.StoreId AND
                    ct2.Date = CURDATE() - INTERVAL 1 DAY
             )
GROUP BY StoreId, CAST(DATE AS DATE)
ORDER BY 2,1

假设最近感兴趣的日期是昨天,您可以使用相关子查询来确保数据可用。