从表格中选择过去四周未添加的字段

时间:2014-09-29 10:35:25

标签: sql

我有一个包含以下列的表:

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实现我想要的东西?

4 个答案:

答案 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)