2013-10-07 118 views
2

這是一個非常簡化的表格,但過程應該是相同的。我想計算登錄之間的天數。這是表設置查詢。計算行間表之間的日期差異[PostgreSQL]

create table tester (user_id int, login_day date); 

insert into tester (user_id,login_day) 
values 
(1,'2013-10-02'), 
(1,'2013-10-05'), 
(2,'2013-10-03'), 
(2,'2013-10-04'), 
(2,'2013-10-07'); 

爲了讓這樣的:

user_id; login_day 
    1; "2013-10-02" 
    1; "2013-10-05" 
    2; "2013-10-03" 
    2; "2013-10-04" 
    2; "2013-10-07" 

結果表應該是這樣的:

user_id; login_day; tau 
    1;"2013-10-02"; 2 
    1;"2013-10-05"; 1 --see edit 
    2;"2013-10-03"; 0 
    2;"2013-10-04"; 2 
    2;"2013-10-07"; 0 

凡頭是天-1的區別。 User_id(1)在2日和5日登錄。所以他們的tau值是2,因爲登錄之間是兩天。

User_id(2)由於在連續日期內登錄,所以其值爲0。

由於沒有時間過去,第7次得到0。如果更容易,也可以標記爲-1。

非常感謝您的幫助。非常感激。

編輯 澄清。 User_id(1),2013-10-05的tau值爲1,因爲它們在將當前日視爲第7天時尚未重新登錄。 例如,如果有人沒有重新登錄,他們的頭值不斷增加。因此,自從user_id = 1上次登錄時,他們當前的tau值爲1,並且該值每天不會再重新登錄,因此每天都會增加1個。 再次感謝 - 特別是a_horse_with_no_name和Linger for the快速反應,並幫助我澄清一下這個問題

+0

我不明白你的編輯。您首先說的是您需要登錄日期和上次登錄日期之間的天數。我的答案告訴你如何得到這個。現在您需要登錄日期和當前日期之間的天數。但是,您的結果表格仍然反映了您的第一個要求。那麼你想要什麼,登錄日期和登錄日期和當前日期之間的天數?你能解決你的結果表嗎? – Linger

+0

@靈兒。你的回答是正確的,並顯示我想要的。我想測量登錄之間的天數。所以如果有人沒有重新登錄,他們的頭值就會不斷增加。因此,由於user_id = 1在5日上次登錄,因此它們的tau值爲1,並且該值每天都會不斷增加1,因此它們不會重新登錄。 –

+0

好的,如果我的答案是您正在查找的內容爲了和最好的答案,你能將它標記爲接受的答案嗎? – Linger

回答

1

如果你沒有在搜索結果介意空,那麼你可以使用(SAMPLE):如果你想檢查null並分配0然後使用

SELECT m.user_id, m.login_day, m.login_day - 
(
    SELECT MAX(login_day) 
    FROM tester AS s 
    WHERE m.user_id = s.user_id 
    AND s.login_day < m.login_day 
) - 1 AS DaysInBetween 
FROM tester AS m 

以下(SAMPLE):

SELECT TopL.user_id, TopL.login_day, 
     COALESCE(TopL.DaysInBetween, 0) As TotalD 
FROM (
     SELECT m.user_id, m.login_day, 
      m.login_day - 
      (
      SELECT MAX(login_day) 
      FROM tester AS s 
      WHERE m.user_id = s.user_id 
      AND s.login_day < m.login_day 
      ) - 1 AS DaysInBetween 
     FROM tester AS m 
     ) AS TopL 
ORDER BY user_id, 
     login_day 

這裏是另一個查詢來考慮(SAMPLE):

SELECT TopL.user_id, TopL.login_day, 
     CASE (COALESCE(TopL.DaysInBetween, 0)) WHEN '-1' 
      THEN '0' ELSE COALESCE(TopL.DaysInBetween, 0) END 
      As TotalD 
FROM (
     SELECT m.user_id, m.login_day, 
     COALESCE(
     (
      SELECT MIN(login_day) 
      FROM tester AS s 
      WHERE m.user_id = s.user_id 
      AND s.login_day > m.login_day 
     )- m.login_day - 1, current_date - m.login_day-1) 
     AS DaysInBetween 
     FROM tester AS m 
     ) AS TopL 
ORDER BY user_id, 
     login_day 
3

這使你接近正確答案:

select user_id, 
     login_day, 
     lead(login_day) over (partition by user_id order by user_id) - login_day - 1 as tau 
from tester 
order by user_id, login_day; 

輸出:

 
user_id | login_day | tau 
--------+------------+------- 
1  | 2013-10-02 | 2  
1  | 2013-10-05 | (null) 
2  | 2013-10-03 | 0  
2  | 2013-10-04 | 2  
2  | 2013-10-07 | (null) 

由於我不明白規則,爲什麼爲user_id = 1「最後」登錄生成2,但對於user_id 2最後登錄生成0我不太確定如何修復第二個日誌的錯誤顯示in user_id = 1

+0

對不起,我忘記說我是在當天的第七天。因此,用戶還沒有登錄2天或者1天。 –

+0

Tau基本上是從上次登錄'之後'。謝謝 –

+0

@AndrewEscobedo:那麼我不明白爲什麼user_id = 1的第一次登錄獲得2,但user_id = 2的第一次登錄獲得0.因爲兩者都是「第一次」登錄,所以沒有這樣的事情「自上次以來」的dasys數量 –