如何在sqlite中创建复杂的聚合函数

问题描述

假设我有下表,其中第一列中有两组观察日期 (2015-01-01,2016-01-01)。对于每个观察日期,都有关联的 item_dateitem_value

观察日期 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),我会得到以下结果。

观察日期 item_date item_value
2015-01-01 2014-09-30 7
2016-01-01 2015-09-30 16

现在,我想创建自己的函数,而不是 max 聚合函数。我的目标如下: 对于每个观察日期,我想返回 item_daten 之前 max(item_date) 年的行。例如,如果 n=1,我将从 item_date获取 max(item_date) 是 1 年前的行。

观察日期 item_date item_value
2015-01-01 2013-09-30 3
2016-01-01 2014-09-30 12

请注意,我只是不想要日期,而是想要整行。我一直在研究 sqlite 的 create_aggregate 功能,但我不知道如何返回整行。我有什么想法可以做到这一点吗?

如果有更有效的方法来实现这一点,请告诉我。

解决方法

您需要一个相关子查询,它为每个 observation_date 返回最大日期减去 ? 年:

sql = """
SELECT t1.*
FROM tablename t1
WHERE t1.item_date = (
  SELECT DATE(MAX(t2.item_date),'-' || ? || ' year') 
  FROM tablename t2 
  WHERE t2.observation_date = t1.observation_date
);
"""
cursor = conn.cursor()
cursor.execute(sql,("1",))

参见demo