所以我的关系很简单:关系(ID,日期),哪个ID不是唯一的,不一定是任何顺序。每个ID都有一个日期(相同的ID可以具有相同的日期)。我的问题是找到所有ID的日期和NEXT日期之间的最长间隔。
所以,如果表格是这样的:
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在一起
我认为这个查询对您有用:
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
的下边界和上边界。之后我们检查下边界和上边界,当它们等于使格式化的字符串为零时。
我希望这就是你要找的东西
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获取下一个日期,以确定两个条目之间的持续时间。使用Postgres Recursive查询,您可以使用Windows函数重用原始查询。
我在日志表中使用过DISTINCT,但您也可以直接使用存储ID的表。