2017-06-15 104 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最大和最小的日期範圍列表
自我加入:自我加入,當我們有每個用戶的範圍。

感謝