我正在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天内进行交易。那么这个问题的解决方案是什么?
答案 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
)