如何解决如何在sqlite中创建复杂的聚合函数
假设我有下表,其中第一列中有两组观察日期 (2015-01-01
,2016-01-01
)。对于每个观察日期,都有关联的 item_date
和 item_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_date
在 n
之前 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。