【问题标题】:How to create a complex aggregate function in sqlite如何在 sqlite 中创建复杂的聚合函数
【发布时间】:2021-07-07 06:05:45
【问题描述】:

假设我有下表,其中第一列中有两组观察日期(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 聚合函数。我的目标如下: 对于每个观察日期,我想在max(item_date) 之前返回item_daten 的行。例如,如果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


【解决方案1】:

您需要一个相关子查询,它为每个 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

【讨论】:

  • 我不知道相关子查询,这解决了问题。谢谢!
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 2012-06-20
  • 2020-08-01
  • 2012-07-22
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多