【发布时间】:2021-07-07 06:05:45
【问题描述】:
假设我有下表,其中第一列中有两组观察日期(2015-01-01、2016-01-01)。对于每个观察日期,都有关联的item_date和item_value。
| observation_date | item_date | item_value |
|---|---|---|
| 2015-01-01 | 2012-12-31 | 0 |
| 2015-01-01 | 2013-03-31 | 1 |
| 2015-01-01 | 2013-06-30 | 2 |
| 2015-01-01 | 2013-09-30 | 3 |
| 2015-01-01 | 2013-12-31 | 4 |
| 2015-01-01 | 2014-03-31 | 5 |
| 2015-01-01 | 2014-06-30 | 6 |
| 2015-01-01 | 2014-09-30 | 7 |
| 2016-01-01 | 2013-09-30 | 8 |
| 2016-01-01 | 2013-12-31 | 9 |
| 2016-01-01 | 2014-03-31 | 10 |
| 2016-01-01 | 2014-06-30 | 11 |
| 2016-01-01 | 2014-09-30 | 12 |
| 2016-01-01 | 2014-12-31 | 13 |
| 2016-01-01 | 2015-03-31 | 14 |
| 2016-01-01 | 2015-06-30 | 15 |
| 2016-01-01 | 2015-09-30 | 16 |
如果我按observation_date 分组并得到max(item_date),我会得到以下结果。
| observation_date | item_date | item_value |
|---|---|---|
| 2015-01-01 | 2014-09-30 | 7 |
| 2016-01-01 | 2015-09-30 | 16 |
现在我想创建自己的函数,而不是 max 聚合函数。我的目标如下:
对于每个观察日期,我想在max(item_date) 之前返回item_date 为n 的行。例如,如果n=1,我会从max(item_date) 中获取一年前item_date 所在的行。
| observation_date | item_date | item_value |
|---|---|---|
| 2015-01-01 | 2013-09-30 | 3 |
| 2016-01-01 | 2014-09-30 | 12 |
请注意,我根本不想要日期,而是整行。我一直在查看 sqlite 的 create_aggregate 功能,但我不知道如何返回整行。有什么想法可以做到这一点吗?
如果有更有效的方法来实现这一点,请告诉我。
【问题讨论】:
-
您确定总有一行日期等于 max date - 每个观察日期为 1 年?
-
如果您使用的是
n=1,11 个月前的item_date会不会显示?如果我理解正确,您只需要 1 条记录,对吗? -
@RuiCosta 为什么
n=1会显示 11 个月前的日期而不是 12 个月?是的,我只想要 1 条记录 -
@forpas 是的,如果日期之前有足够多的行,则日期总是等于最大日期 - 1 年,依此类推。
item_date是一系列连续的季度结束日期
标签: python sql sqlite sql-date-functions sql-max