我正在尝试使用SQL查询解决问题,需要一些专家的建议。
我有下面的交易表。
-- UserID, ProductId, TransactionDate
-- 1 , 2 , 2014-01-01
-- 1 , 3 , 2014-01-05
-- 2 , 2 , 2014-01-02
-- 2 , 3 , 2014-05-07
.
.
.
我想要实现的是找到购买了多个产品的所有用户在30天内。
到目前为止我的查询就像
select UserID, COUNT(distinct ProductID)
from tableA
GROUP BY UserID HAVING COUNT(distinct ProductID) > 1
我不知道在哪里申请"在30天内#34;查询中的逻辑。
结果应该是:
1, 2
2, 1
提前感谢您的帮助。
答案 0 :(得分:2)
编辑:30天内
SELECT
a.UserID,
COUNT(DISTINCT ProductID)
FROM TableA a
INNER JOIN (
SELECT UserID, TransactionDate = MAX(TransactionDate)
FROM TableA
GROUP BY UserID
) AS t
ON t.UserID = a.UserID
AND a.TransactionDate >= DATEADD(DAY, -30, t.TransactionDate)
AND a.TransactionDate <= t.TransactionDate
GROUP BY a.UserID
您可以使用GROUP BY YEAR(TransactionDate), MONTH(TransactionDate)
SELECT
UserID,
COUNT(DISTINCT ProductID)
FROM TableA
GROUP BY
UserID, YEAR(TransactionDate), MONTH(TransactionDate)
HAVING
COUNT(DISTINCT ProductID) > 1
答案 1 :(得分:0)
只需添加一个where子句。
SELECT UserID, COUNT(DISTINCT ProductID) cnt
FROM tableA
WHERE TransactionDate >= CAST(DATEADD(DAY,-30,GETDATE()) AS DATE)
GROUP BY UserID
HAVING COUNT(DISTINCT ProductID) > 1
这是有效的,因为where子句是在Group By和Having之前执行的。因此,首先它会过滤掉30天以上的所有交易,然后只返回购买两种不同产品的人。