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

How to create a complex aggregate function in sqlite

假设我有以下 table,其中第一列中有两组观察日期(2015-01-012016-01-01)。对于每个观察日期,都有关联的 item_dateitem_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 聚合函数。我的目标如下: 对于每个观察日期,我想 return item_datemax(item_date)n 年的行。例如,如果 n=1,我将从 max(item_date).

中获取 item_date 是 1 年前的行
observation_date item_date item_value
2015-01-01 2013-09-30 3
2016-01-01 2014-09-30 12

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

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

您需要一个相关的子查询 returns 每个 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