如何在sqlite中创建一个复杂的聚合函数
How to create a complex aggregate function in sqlite
假设我有以下 table,其中第一列中有两组观察日期(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
聚合函数。我的目标如下:
对于每个观察日期,我想 return item_date
比 max(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。
假设我有以下 table,其中第一列中有两组观察日期(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
聚合函数。我的目标如下:
对于每个观察日期,我想 return item_date
比 max(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。