如何在Presto中按用户ID获取前两大值?寻求优雅实现方案
需求:获取每个用户最新的两条病症记录
我之前尝试的方法不够优雅,发现nth_value(x, offset)窗口函数似乎正好适用这类场景,但能找到的示例只有Starburst提供的这个:
SELECT name, nth_value(name, 2) OVER ( ORDER BY name ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS value FROM region;
这个示例里没有我需要的按用户ID分组的部分。
我的数据集如下:
| 用户ID | 日期 | 病症 |
|---|---|---|
| 1 | 01/01/2000 | 中风 |
| 1 | 01/02/2000 | 感冒 |
| 2 | 02/02/2000 | 中风 |
| 2 | 02/03/2000 | 哮喘 |
| 2 | 02/05/2000 | 心脏病发作 |
| 3 | 01/08/2000 | 哮喘 |
| 3 | 01/18/2000 | 心脏病发作 |
| 3 | 01/10/2000 | 中风 |
| 4 | 05/12/2000 | 哮喘 |
| 4 | 05/13/2000 | 感冒 |
期望输出每个用户ID对应的两条最新日期记录:
| 用户ID | 日期 | 病症 |
|---|---|---|
| 1 | 01/02/2000 | 感冒 |
| 1 | 01/01/2000 | 中风 |
| 2 | 02/05/2000 | 心脏病发作 |
| 2 | 02/03/2000 | 哮喘 |
| 3 | 01/18/2000 | 心脏病发作 |
| 3 | 01/10/2000 | 中风 |
| 4 | 05/13/2000 | 感冒 |
| 4 | 05/12/2000 | 哮喘 |
我知道可以用rank()函数来实现部分逻辑:
SELECT id, rank() OVER ( PARTITION BY id ORDER BY date DESC) AS rnk FROM condition
但我觉得这个方案不够优雅,想找到更合适的实现方式。
内容的提问来源于stack exchange,提问作者Yann Stoneman
相关产品推荐
相关产品推荐

