如何查找两个日期之间连续的天数
How to find continuous days between two dates
我有像图片中那样的情况,其中商品可用性的日期不会继续。我想知道,每次可用时,它会在网站上持续停留多长时间。
我想像下面这样找到我 table 中的每一项:
这是典型的缺口孤岛问题
这是一种使用 window 函数的方法:
select
item,
min(available_date) min_available_date,
max(available_date) max_available_date,
count(*) no_days
from (
select
t.*,
sum(case when available_date = lag_available_date + interval '1' day then 0 else 1 end)
over(
partition by item
order by available_date
rows between unbounded preceding and current row
) grp
from (
select
t.*,
lag(available_date)
over(partition by item order by available_date) lag_available_date
from mytable t
) t
) t
group by item, grp
order by item, min_available_date
最内层查询恢复"previous"记录的日期。下一级做一个 window 总和,每次日期不连续时增加 1
:这定义了组。然后,外层查询按组聚合。
示例数据:
item | available_date
:--- | :-------------
ABA | 2019-01-04
ABA | 2019-01-05
ABA | 2019-01-06
ABA | 2019-01-07
ABA | 2019-01-12
ABA | 2019-01-15
ABA | 2019-01-16
ABA | 2019-01-17
ABA | 2019-01-19
ABA | 2019-01-21
ABA | 2019-01-22
查询结果:
item | min_available_date | max_available_date | no_days
:--- | :----------------- | :----------------- | ------:
ABA | 2019-01-04 | 2019-01-07 | 4
ABA | 2019-01-12 | 2019-01-12 | 1
ABA | 2019-01-15 | 2019-01-17 | 3
ABA | 2019-01-19 | 2019-01-19 | 1
ABA | 2019-01-21 | 2019-01-22 | 2
我有像图片中那样的情况,其中商品可用性的日期不会继续。我想知道,每次可用时,它会在网站上持续停留多长时间。
我想像下面这样找到我 table 中的每一项:
这是典型的缺口孤岛问题
这是一种使用 window 函数的方法:
select
item,
min(available_date) min_available_date,
max(available_date) max_available_date,
count(*) no_days
from (
select
t.*,
sum(case when available_date = lag_available_date + interval '1' day then 0 else 1 end)
over(
partition by item
order by available_date
rows between unbounded preceding and current row
) grp
from (
select
t.*,
lag(available_date)
over(partition by item order by available_date) lag_available_date
from mytable t
) t
) t
group by item, grp
order by item, min_available_date
最内层查询恢复"previous"记录的日期。下一级做一个 window 总和,每次日期不连续时增加 1
:这定义了组。然后,外层查询按组聚合。
示例数据:
item | available_date :--- | :------------- ABA | 2019-01-04 ABA | 2019-01-05 ABA | 2019-01-06 ABA | 2019-01-07 ABA | 2019-01-12 ABA | 2019-01-15 ABA | 2019-01-16 ABA | 2019-01-17 ABA | 2019-01-19 ABA | 2019-01-21 ABA | 2019-01-22
查询结果:
item | min_available_date | max_available_date | no_days :--- | :----------------- | :----------------- | ------: ABA | 2019-01-04 | 2019-01-07 | 4 ABA | 2019-01-12 | 2019-01-12 | 1 ABA | 2019-01-15 | 2019-01-17 | 3 ABA | 2019-01-19 | 2019-01-19 | 1 ABA | 2019-01-21 | 2019-01-22 | 2