周/月/季度结束前 N 天的最大值

Posted

技术标签:

【中文标题】周/月/季度结束前 N 天的最大值【英文标题】:Max Value in N days before end of week/month/quarter 【发布时间】:2021-02-05 12:51:11 【问题描述】:

我有一个数据框df,其中包含许多ids 的每日数据,示例:

| yyyy_mm_dd | id   | availability |
|------------|------|--------------|
| 2020-01-01 | 1334 | 300          |
| 2020-01-02 | 1334 | 676          |
| 2020-01-03 | 1334 | 463          |
| ...        | 1334 | ...          |
| 2020-03-29 | 1334 | 564          |
| 2020-03-30 | 1334 | 765          |
| 2020-03-31 | 1334 | 7564         |
| ...        | 1334 | ...          |
| 2020-06-28 | 1334 | 4634         |
| 2020-06-29 | 1334 | 65           |
| 2020-06-30 | 1334 | 643          |
| ...        | 1334 | ...          |

如何确定季度结束前最后 N 天的最大 availability? IE。如果 N = 3,那么我想在每个季度结束前的最后 3 天内找到每个 id 的最大值 availability

我知道我可以对日期进行硬编码,但我想尽可能避免这种情况。 windowing 可以帮忙吗?

基于上述输入的预期输出:

| id   | year | quarter | max_availability |
|------|------|---------|------------------|
| 1334 | 2020 | 01      | 7564             |
| 1334 | 2020 | 02      | 4634             |

【问题讨论】:

能否请您显示预期的输出? 我修改了输入数据并添加了预期的输出,希望更清楚 【参考方案1】:

您可以试试下面的这段代码,它获取季度结束前的最后 10 行,并计算按 id 分组的最大可用性。

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'rn',
    F.row_number().over(
        Window.partitionBy(
            'id',
            F.quarter('yyyy_mm_dd'), 
            F.year('yyyy_mm_dd')
        ).orderBy(F.desc('yyyy_mm_dd'))
    )
).filter('rn <= 10').groupBy(
    'id',
    F.quarter('yyyy_mm_dd').alias('quarter'), 
    F.year('yyyy_mm_dd').alias('year')
).agg(
    F.max('availability').alias('max_availability')
)

df2.show()
+----+-------+----+----------------+
|  id|quarter|year|max_availability|
+----+-------+----+----------------+
|1334|      1|2020|            7564|
|1334|      2|2020|            4634|
+----+-------+----+----------------+

【讨论】:

看起来不错,我有两个问题。 1)这里如何处理不完整的季度,即不完整/当前 q? 2) 如果最后三天的最大可用性与每个 ID 相同,会发生什么情况? @stackq 1) 它仍然需要最近 10 天,例如在当前 q 中,大约是 1 月 25 日到 2 月 5 日。如果少于 10 天,则需要所有时间。 2)不确定你在问什么。如果可用性相同,则最大值将等于任何值。

以上是关于周/月/季度结束前 N 天的最大值的主要内容,如果未能解决你的问题,请参考以下文章

获取该日期所在季度前一个季度的最后一天的日期

oracle求查询连续三天的数据

雇佣兵

周、月、季度和年的 Impala 日期

oracle按天,周,月,季度,年查询排序

2019年第一季度学习计划