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



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

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.为我指明了正确的方向!

最新更新