2017-08-03 22 views
1

假設我有一個表格式SQL查詢點的變化只有在特定的時間

user, fav_colour, date 

樣本數據:

a, green, 2015-10-1 
a, green, 2016-10-1 
a, yellow, 2016-12-1 
b, red, 2015-10-1 
b, red, 2016-10-1 
b, red, 2017-10-1 
c, black, 2014-10-1 
c, black, 2015-10-1 
c, blue, 2016-02-1 

我將如何運行,返回用戶的查詢,其中,最新fav_colour與以前的fav_colour不同,時間差至少3個月

所以查詢會返回

c 

一個不包括在內,因爲黃遵循綠色僅兩個月後

回答

1

可以使用lag窗口功能查找每行的前一行。但是請注意,你不能在where子句中使用它,所以你必須使用子查詢,或等同的東西:

SELECT username 
FROM (SELECT username, 
       fav_colour, 
       LAG(fav_colour) OVER (PARTITION BY username ORDER BY date) AS 
        prev_fav_colour, 
       date, 
       LAG(date) OVER (PARTITION BY username ORDER BY date) AS 
        prev_date 
     FROM colours) c 
WHERE fav_colour != prev_fav_colour AND 
     AGE(date, prev_date) >= INTERVAL '3 MONTHS'; 
+0

什麼是顏色在這裏?這是你稱之爲桌子嗎? – Abe

+0

@Abe是的 - 你沒有指定一個表名,所以我只是去了一些有意義的東西 – Mureinik

+0

好的謝謝,什麼是C?你在調用子查詢嗎?是否需要一個名字? – Abe

1

下面的查詢使用的第一個限制表,最近的兩次記錄每一個用戶,然後檢查日期差的方法最近的日期和第二次到最近的日期之間的月份。

SELECT 
    t.user 
FROM 
(
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY t.user ORDER BY t.date DESC) rn 
    FROM your_table t 
) t 
WHERE t.rn <= 2 
GROUP BY t.user 
HAVING 
    MAX(t.fav_colour) <> MIN(t.fav_colour) AND -- different colors 
    AGE(MAX(t.date::date), MIN(t.date::date)) >= INTERVAL '3 MONTHS'; 
    -- above date calculation ensures 3 months or greater apart 

演示在這裏:

Rextester

1

從我不同的方法,但希望給出了相同的答案。

1)我製作了一個通用表達式(CTE),它添加了一個行號,以按日期升序排列每個用戶的fav_colour。

2)我已經自己在用戶和row_number +1上加入了這個CTE,因此每條記錄都應該匹配到該用戶的下一條記錄。

3)然後在WHERE子句我已經相隔3個月的標準和不同的顏色

希望這有助於!

WITH CTE 
AS 
(
SELECT 
user, 
fav_colour, 
date, 
ROW_NUMBER() OVER (PARTITION BY user ORDER BY date ASC) as rn 
) 

SELECT 
CTE1.user 
FROM CTE AS CTE1 
INNER JOIN CTE AS CTE2 CTE1.user=CTE2.user ON CTE1.rn=(CTE2.rn+1) 
WHERE DATEDIFF(mm,CTE1.date,CTE2.date) >=3 
AND CTE1.fav_colour<>CTE2.fav_colour;