这是一个非常简单的表,但过程应该是相同的。我想计算两次登录之间的天数。这是表设置查询。
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/