我真正的选择陈述的摘要:
select
lag(somecol) over (partition by thing_id) as prev_1,
lag(somecol,2) over (partition by thing_id) as prev_2,
lag(somecol,3) over (partition by thing_id) as prev_3,
othercol,
...
在真正的查询中,over
要复杂得多,导致代码非常密集,难以理解。此外,获取最后3行是硬编码的(vs n = what)。
直接SQL中是否有任何方法可以迭代或递归地指定这些prev_x
列,以便1)代码更具可读性; 2)您可以动态指定prev cols的数量n?
答案 0 :(得分:1)
为了回答第一个问题,为了使代码更具可读性,Postgres允许定义窗口,为其命名,然后在查询中多次引用它。
请参阅Window Functions的文档:
当查询涉及多个窗口函数时,可以 用一个单独的OVER子句写出每一个,但这是 如果需要相同的窗口行为,则重复且容易出错 有几个功能。相反,可以命名每个窗口行为 在WINDOW子句中,然后在OVER中引用。例如:
SELECT sum(salary) OVER w, avg(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
我不知道此功能是否属于SQL标准,但我知道SQL Server不支持它。
因此,您的查询将如下所示:
select
lag(somecol) over w as prev_1,
lag(somecol,2) over w as prev_2,
lag(somecol,3) over w as prev_3,
othercol,
...
from
...
WINDOW w AS (partition by thing_id)
;
关于你的第二个问题,如何"动态指定prev cols的数量n" - 您需要动态生成SELECT
语句的文本才能实现。 RDBMS假设模式是稳定的,即表和查询中的列数通常是固定的,而不是动态的。