从表中选择自过去60天以来尚未创建时间戳的行

时间:2016-02-16 10:56:09

标签: sql sql-server transactions timestamp

我正在sql管理工作室中使用sql server 2012处理一个项目,我希望获得一个包含用户编号的列表,这些用户编号在过去60天内没有进行过交易。数据来自2个表(用户和事务),其中一个表包含用户编号和用户标识,另一个表包含事务时间戳和用户标识。我现在的解决方案是:

SELECT a.usernumber
FROM [user] a left join [transaction] b on a.id = b.user_id 
WHERE b.timestamp <= (SELECT getdate()-60) and a.usernumber is not null

问题是,现在它将返回超过60天前进行交易的所有用户,但他们也可以在过去60天内进行交易。那么这个问题的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

您可以按usernumber对结果进行分组,计算max(b.timestamp)并在您需要的日期之前仅选择具有最新时间戳的记录:

select a.usernumber
from [user] a 
    left join [transaction] b on a.id = b.user_id 
where a.usernumber is not null
group by a.usernumber
having max(b.timestamp) <= (SELECT getdate()-60)

答案 1 :(得分:0)

无需使用getdate()前缀select。但是最好在select语句之前计算不依赖于每一行的参数。您可以使用其他词语定义您的目标:向我显示没有超过60天的交易的用户。

让我们直接将其翻译为sql语句:

declare @oldestdate datetime

set @oldestdate = dateadd(dd, -60, getdate())

select u.username
from [user] u
where not exists
  (
    select 1 
    from [transaction] t
    where t.user_id = u.user_id
      and t.timestamp > @oldestdate
  )