【发布时间】:2019-07-30 02:54:11
【问题描述】:
我有下表:
epochTime,id,counter1,value
123,Alpha,2,2
124,Beta,0,3
135,Alpha,0,1
112,Alpha,0,5
150,Alpha,0,-1
225,Beta,1,2
228,Beta,1,0
300,Beta,0,2
我想选择所有 counter1 > 0 的记录和之后的记录,按 id 分区和按 epochTime 排序(要求类似于 Unix 的“grep -A 1”命令) 因此,上述数据的预期结果将是
epochTime id counter1 value
123 Alpha 2 2
135 Alpha 0 1
225 Beta 1 2
228 Beta 1 0
300 Beta 0 2
我正在使用 AWS Athena,并得到以下查询,它按预期工作。
SELECT * FROM (
SELECT id,
epochTime,
counter1,
value,
first_value(counter1) OVER (
PARTITION BY id
ORDER BY epochTime
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS preCounter
FROM testsql
) WHERE counter1 > 0 OR preCounter > 0
但是,我发现查询存在两个问题:
- 这是一个嵌套查询
-
我需要创建一个虚拟列 (preCounter)。如果 WHERE 条件的要求变得更加复杂(即:多列条件),我需要创建多个虚拟列
- 是否有更好的解决方案(更好的性能、更简单的查询……)适合我?
- 如果 counter1 是我需要选择的以下记录数怎么办?
【问题讨论】:
标签: sql window-functions amazon-athena presto