首页 > 解决方案 > 检索每组中的最后 n 条记录 - GCP Spanner

问题描述

有一张数据表

ID   CLIENT_ID   TYPE           VALUE   DATE
-----------------------------------------------------------
1     101         original       1.2    2020-03-01T13:14:00
2     101         additional     2.7    2020-03-02T13:14:00
3     101         additional     2.65   2020-03-03T13:14:00
4     101         original       1.8    2020-03-04T13:14:00
5     102         original       1.65   2020-04-05T13:14:00
6     102         additional     2.76   2020-04-06T13:14:00
7     102         additional     2.9    2020-04-07T13:14:00
8     102         original       1.1    2020-04-08T13:14:00
9     102         additional     2.65   2020-05-09T13:14:00
10    102         original       1.36   2020-05-10T13:14:00
11    102         original       1.48   2020-05-11T13:14:00
12    102         additional     2.87   2020-05-12T13:14:00
13    101         original       1.69   2020-06-13T13:14:00
14    101         additional     2.95   2020-06-14T13:14:00
15    101         additional     2.87   2020-06-15T13:14:00
16    101         original       1.23   2020-06-16T13:14:00

我想按 CLIENT_ID、TYPE 和 DATE 检索最近的 2 条记录。

ID   CLIENT_ID   TYPE           VALUE   DATE
-----------------------------------------------------------
15    101         additional     2.87   2020-06-15T13:14:00
14    101         additional     2.95   2020-06-14T13:14:00
16    101         original       1.23   2020-06-16T13:14:00
13    101         original       1.69   2020-06-13T13:14:00
12    102         additional     2.87   2020-05-12T13:14:00
9     102         additional     2.65   2020-05-09T13:14:00
11    102         original       1.48   2020-05-11T13:14:00
10    102         original       1.36   2020-05-10T13:14:00

或聚合

ID   CLIENT_ID   TYPE           VALUE   DATE                 VALUE_2ND   DATE_2ND
----------------------------------------------------------------------------------------------
15    101         additional     2.87   2020-06-15T13:14:00   2.95        2020-06-14T13:14:00
16    101         original       1.23   2020-06-16T13:14:00   1.69        2020-06-13T13:14:00
12    102         additional     2.87   2020-05-12T13:14:00   2.65        2020-05-09T13:14:00
11    102         original       1.48   2020-05-11T13:14:00   1.36        2020-05-10T13:14:00

不幸的是,Spanner 不支持窗口函数。

怎么可能呢?

标签: sqlgoogle-cloud-platformgreatest-n-per-groupgoogle-cloud-spanner

解决方案


在标准 SQL 中,您可以将其表示为:

select t.*
from t
where t.date in (select t2.date
                 from t t2
                 where t2.client_id = t.client_id and
                       t2.type = t.type
                 order by t2.date desc
                 limit 1 offset 1
                )
order by t.client_id, t.type, t.date;

我不是 100% 确定这在 Spanner 中有效,但值得一试。


推荐阅读