在 SQL Server 中,我在
Visit
和 Customer
表之间有一个连接表 Store
。
我正在努力寻找:
Visit
表包含日期和其他字段,因此同一客户会在多个日期进行多次访问。我认为以下查询是正确的 - 因为它似乎返回了正确的结果:
SELECT DISTINCT v.CustomerID
FROM Visit v
INNER JOIN (
SELECT CustomerID FROM (SELECT DISTINCT CustomerID, StoreID FROM Visit) temp
GROUP BY CustomerID
HAVING COUNT(*) = 1
) c
ON v.CustomerID = c.CustomerID
WHERE v.StoreID IN (1, 10, 16, 42)
但是我想知道是否有任何方法可以简化/清理它,因为其中有多个 DISTINCT 和 GROUP BY 子句。
注意:这并不理想,但如果有必要,我可以接受一个查询,该查询返回以任意组合、任意次数访问过任何所需商店(1、10、16、42)的客户,只要他们没有访问过访问了不在该列表中的商店。
也许是这样的:
SELECT v.CustomerID, MAX(v.StoreID) AS StoreID
FROM Visit v
GROUP BY CustomerID
HAVING COUNT(DISTINCT v.StoreID) = 1
AND MAX(v.StoreID) IN (1, 10, 16, 42)
COUNT(DISTINCT StoreID)
为您的顾客提供只有一家独特的商店
要获取它是哪家商店,我使用
MAX(x.StoreID)
。 MAX 或 MIN 在这里并不重要,只要它是某种聚合即可。