2017-06-15 75 views
0

我有一个表user_idtimestamp和其他特征。我试图选择除了最近90天之前包含用户上次标记的所有行。由于用户最后的timestamp对于每个用户都不同,我不能简单地包含具有两个固定日期的BETWEEN条件。选择两个日期之间的所有行与动态MAX(日期)

我已经尝试没有运气以下的变化

SELECT mt.user_id, mt.date_logged AS dates 
FROM members_table AS mt 
WHERE DATEDIFF(d, mt.date_logged, MAX(mt.date_logged)) < 90 
+0

你试过的查询会发生什么? –

+0

它给出了以下错误:'SQL错误[1582] [42000]:调用本地函数'DATEDIFF'的参数数量不正确 – Lukasz

+0

我想说这很明显,为什么它不工作。你有太多的参数。也许使用DATEPART和TO_DAYS的组合? –

回答

1

不能在WHERE子句中使用聚合函数,因为聚集选择行之后会发生。您需要加入一个为每个用户返回最大值的子查询。

SELECT mt.user_id, mt.date_logged AS dates 
FROM members_table AS mt 
JOIN (
    SELECT user_id, DATE_SUB(MAX(date_logged), INTERVAL 90 DAY) AS startdate 
    FROM members_table 
    GROUP BY user_id) AS mx 
ON mt.user_id = mx.user_id AND mt.date_logged > mx.start_date 
0

尝试是这样的:

SELECT mt.user_id, mt.date_logged AS dates 
FROM 
(SELECT 
    user_id, 
    max(date_logged) AS max_dts, 
    dateadd(max(date_logged), interval -90 day) last90_dts 
FROM 
    members_table 
GROUP BY user_id) der 
join members_table AS mt ON mt.user_id=der.user_id and mt.date_logged between last90_dts and max_dts; 

派生表:创建有每userwise最大和最小的日期范围列表
自我加入:自我加入,当我们有每个用户的范围。

感谢

相关问题