如何使用postgres获取当前日期的连续天数?

How to get number of consecutive days from current date using postgres?

我想使用 Postgres SQL.

获取从当前日期开始的连续天数

enter image description here

上面是我强调的连续天数应该是这样的场景。

下面是我创建的 SQL 查询,但它没有返回预期的结果

with grouped_dates as (
  select user_id, created_at::timestamp::date, 
         (created_at::timestamp::date - (row_number() over (partition by user_id order by created_at::timestamp::date) || ' days')::interval)::date as grouping_date
  from watch_history
)
select * , dense_rank() over (partition by grouping_date order by created_at::timestamp::date) as in_streak
from grouped_dates where user_id = 702
order by created_at::timestamp::date

谁能帮我解决这个问题?

如果无论如何我们能够将 distinct for created_at 字段应用到下面的查询,那么我将为我的问题找到解决方案。

WITH list AS
(
SELECT user_id,
  (created_at::timestamp::date - (row_number() over (partition by user_id order by created_at::timestamp::date) || ' days')::interval)::date as next_day
  FROM watch_history
)
SELECT user_id, count(*) AS number_of_consecutive_days
  FROM list
 WHERE next_day IS NOT NULL
 GROUP BY user_id

有没有人知道如何将 distinct 应用于上述查询的 created_at

获取相同user_id的“连续天数”:

WITH list AS
(
SELECT user_id
     , array_agg(created_at) OVER (PARTITION BY user_id ORDER BY created_at RANGE BETWEEN CURRENT ROW AND '1 day' FOLLOWING) AS consecutive_days
  FROM watch_history
)
SELECT user_id, count(DISTINCT d.day) AS number_of_consecutive_days
  FROM list
 CROSS JOIN LATERAL unnest(consecutive_days) AS d(day)
 WHERE array_length(consecutive_days, 1) > 1
 GROUP BY user_id

获取相同user_id的“连续天数”列表:

WITH list AS
(
SELECT user_id
     , array_agg(created_at) OVER (PARTITION BY user_id ORDER BY created_at RANGE BETWEEN CURRENT ROW AND '1 day' FOLLOWING) AS consecutive_days
  FROM watch_history
)
SELECT user_id
     , array_agg(DISTINCT d.day ORDER BY d.day) AS list_of_consecutive_days
  FROM list
 CROSS JOIN LATERAL unnest(consecutive_days) AS d(day)
 WHERE array_length(consecutive_days, 1) > 1
 GROUP BY user_id

完整示例和结果 dbfiddle