所以我的关系很简单:关系(ID,日期),该ID不是唯一的,并且不一定按任何顺序排列。每个ID都有一个日期(相同的ID可以具有相同的日期)。我的问题是找到所有ID的日期与其下一个日期之间的最长间隔。
因此,如果表是这样的:
ID | Date
--------+------------
100 | 2015-06-20
100 | 2015-01-21
100 | 2016-04-23
预期输出将为
ID | interval
--------+------------
100 | (2016-04-23 - 2015-06-20)
或如果ID的所有日期都相同:
ID | Date
--------+------------
100 | 2016-04-23
100 | 2016-04-23
100 | 2016-04-23
预期输出应为
ID | interval
--------+------------
100 | 0
这是一个ID,在我的关系中,共有100个ID
答案 0 :(得分:0)
我认为此查询对您有用:
select t.id,
case
when t.lower != t.upper then '(' || t.lower || ' - ' || t.upper || ')'
else '0' end
from (select
r.id,
min(r.date) as lower,
max(r.date) as upper
from relation r
group by r.id) t;
我们使用子查询来查找每个ID
的上下边界。之后,我们检查上下边界是否相等,使格式化的字符串不为零。
答案 1 :(得分:0)
我希望这就是您要寻找的
WITH x AS
(
SELECT id, _date, lead_date, EXTRACT(epoch FROM age(lead_date,_date))/(3600*24) AS age
FROM
(
SELECT *, lead(_date) over(PARTITION BY id ORDER BY _date ) lead_date
from table_log
order by id, _date
) as z
WHERE lead_date IS NOT NULL
ORDER BY 4 DESC
)
SELECT DISTINCT id ,
(SELECT age FROM x WHERE x.id = t1.id ORDER BY age DESC LIMIT 1)
FROM table_log t1
在这里,我已使用windows function获取下一个日期来确定2个条目之间的持续时间。使用Postgres Recursive查询,您可以重新使用带有Windows功能的原始查询。
我已经使用了日志表中的DISTINCT,但是您也可以直接使用存储ID的表。