【问题标题】:Max value by ID, date and last x daysID、日期和最近 x 天的最大值
【发布时间】:2019-05-07 13:25:25
【问题描述】:

假设我有一张桌子:

 ---------------
 id |  date | value
------------------
  1 |  Jan 1 | 10
  1 |  Jan 2 | 12
  1 |  Jan 3 | 11
  2 |  Jan 4 | 11

我需要获取过去 90 天内每个 ID、每个日期、每个日期的最大值和中值。我正在使用查询:

select id, date, value
max(value) over (partition by id, date) as max_date,
median(value) over (partition by id, date) as med_date
from table
where date > date - interval '90 days'

我尝试导出数据并手动检查,但结果不正确。我错过了什么?谢谢

预期输出是自过去 90 天以来的最大值。例如日期是 4 月 5 日,那么它将找到从 1 月 5 日(过去 90 天)到 4 月 5 日的最大值。然后日期移动到 4 月 6 日,然后它将在 1 月 6 日到 4 月 6 日再次执行,依此类推,每个 ID

【问题讨论】:

  • 请包含您的预期输出,即您希望看到的内容。
  • 我认为你的 where 子句是错误的。它应该类似于: where date > current_date - interval '90 days'
  • 您的 WHERE 令人困惑。 DATE 不能大于 SAME DATE - 90

标签: sql postgresql max


【解决方案1】:

所以我假设你可以获得相同 ID 和日期的多个值,对吗?否则对 id 和 date 进行分区是没有意义的

SELECT id, date, max(value), avg(value) from table where date > date - interval '90 days'
group by id, value

'group by' 进行分区

【讨论】:

  • 使用这个查询,“select”中的日期也会随着where子句中的日期间隔而改变。我希望过去 90 天只申请计算过去 90 天的最大值
【解决方案2】:

为什么要使用窗口函数?这似乎符合您的描述:

select id,
       max(value) as max_date,
       percentile_disc(0.5) within group (order by value) as median_value
from table
where date > date - interval '90 days';

如果你想要这个每个日期,使用窗口函数:

select t.*
from (select t.*,
             max(value) over (order by date range between '89 day' preceding and current row) as running_max_value,
             percentile_disc(0.5) within group (order by value) range between '89 day' preceding and current row) as running_median_value
      from t
     ) t
where date > date - interval '90 days';

过滤器位于外部查询中,因此之前的时间段可以追溯到更远的时间。

【讨论】:

  • 这也会改变日期范围,不是吗?
  • @Elbert 。 . .显然,您可以调整日期范围。你似乎想要 90 天。如果包含当天,则表示过去 89 天。
  • 事情是我想只计算过去 90 天的中位数和最大值,但它会显示前 1 年的所有数据。它以 90 天的窗口移动最大值和中值
猜你喜欢
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多