SQL查询 - 从表中查找不同的用户

时间:2015-05-05 01:27:51

标签: sql sql-server

我正在尝试使用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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

编辑:30天内

SQL Fiddle

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天以上的所有交易,然后只返回购买两种不同产品的人。

查询处理订单: http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/