这是一个非常简单的表,但过程应该是相同的。我想计算两次登录之间的天数。这是表设置查询。

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

其中tau是第1天的差异。
用户id(1)在2号和5号登录。所以他们的tau值是2,因为登录间隔是两天。
用户id(2)的值为0,因为他们连续几天登录。
第七名得0分,因为没有时间了。如果更容易的话,也可以标记为-1。
非常感谢你的帮助。非常感谢。
编辑
澄清。用户id(1),2013-10-05的tau值为1,因为他们在将当前日期视为第7天时没有重新登录。
因此,如果有人没有重新登录,他们的tau值就会不断增加。因此,由于用户id=1上次登录是在5号,所以他们当前的tau值为1,并且该值将在他们不重新登录的每一天继续增加1。
再次感谢一匹没有名字的马,并留连忘返地回答我,帮助我澄清问题

最佳答案

如果您不介意结果为空,则可以使用(SAMPLE):

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

如果要检查Null并指定0,请使用以下(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

关于sql - 计算表之间行之间的日期差[PostgreSQL],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19231974/

10-10 12:57