我有一个包含以下列的表:
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实现我想要的东西?
答案 0 :(得分:2)
如果您使用MSSQL:
SELECT DISTINCT ProductId
FROM table
WHERE Created BETWEEN dateadd(week,-3,getdate()) and dateadd(day,-1,getdate()) ;
修改:今天排除
答案 1 :(得分:1)
对于SQL
SELECT ProductId
FROM Table
WHERE Created Between date()-1 and date()-21
答案 2 :(得分:1)
我使用嵌套的SELECT语句解决了这个问题:
SELECT DISTINCT ProductId
FROM table
WHERE ProductId NOT IN
(
SELECT DISTINCT ProductId
FROM table WHERE Created > dateadd(week,-4,getdate())
)
这将选择在过去四周内添加的所有ProductIds,然后从整个表格中选择所有其他ProductIds。
感谢@rob和@Edi G.指出我正确的方向!
答案 3 :(得分:1)
使用简单的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)