我有一个包含以下列的表:
Id [int]
UserId [int]
ProductId [int]
Created [datetime]
每个用户都可以在任何时间选择任何产品。没有限制。对于一份报告,我必须选择四个星期没有选择的所有产品。
我尝试了以下方法:
SELECT DISTINCT ProductId FROM table WHERE Created > 'Three weeks ago' AND Created < 'today'
问题:如果三周前也添加了产品,那么这个结果也会给出今天添加的产品的Id。
例如,如果我有以下数据:
Id UserId ProductId Created
1 1 3 2014-09-26
2 2 1 2014-08-12
3 3 3 2014-07-26
4 1 2 2014-06-26
5 6 4 2014-05-26
我希望查询返回ProductIds 1、2和4 NOT 3,因为它是用户在过去四周内选择的。
我有点困了。有人知道通过MSSQL实现我想要的目标的方法吗?
如果使用MSSQL:
SELECT DISTINCT ProductId
FROM table
WHERE Created BETWEEN dateadd(week,-3,getdate()) and dateadd(day,-1,getdate()) ;
编辑:今天排除
使用一个简单的GROUP BY查询,您可以选择不同的产品——它们各自的最后Created
日期:
SELECT
ProductId,
MAX(Created) AS LastCreated
FROM
table
GROUP BY
ProductId
;
现在,这将只返回所有产品而不进行筛选,但您需要在LastCreated
上进行筛选。由于该列是聚合的,您可以使用HAVING子句对其进行筛选,如下所示:
SELECT
ProductId
FROM
table
GROUP BY
ProductId
HAVING
MAX(Created) < 'Three weeks ago'
;
实际的'Three weeks ago'
表达式将取决于您的产品所使用的SQL的风格。例如,在SQL Server中,条件如下:
MAX(Created) < DATEADD(WEEK, -3, CURRENT_TIMESTAMP)
对于SQL
SELECT ProductId
FROM Table
WHERE Created Between date()-1 and date()-21
我使用嵌套的SELECT语句解决了这个问题:
SELECT DISTINCT ProductId
FROM table
WHERE ProductId NOT IN
(
SELECT DISTINCT ProductId
FROM table WHERE Created > dateadd(week,-4,getdate())
)
这将选择在过去四周内添加的所有ProductId,然后从整个表中选择所有其他ProductId。
感谢@rob和@Edi G.为我指明了正确的方向!