【发布时间】:2012-09-12 19:15:24
【问题描述】:
我有一个窗口函数,它使用 rank() 操作将最近的 DHCP 日志事件与 IP 地址相匹配,从而将 IP 与主机名相关联。问题是查询不能很好地扩展到大型数据集,因此我想尝试根据 group by 重写它,但我没有成功。
create table large_table as
select column1, column2, column3, column4, column5, column6
from
(
select
a.column1, a.column2, a.start_time,
rank() OVER(
PARTITION BY a.column2, a.column1 order by a.start_time DESC
) as rank,
last_value( a.column3) OVER (
PARTITION BY a.column2, a.column1 order by a.start_time ASC
RANGE BETWEEN unbounded preceding and unbounded following
) as column3,
a.column4, a.column5, a.column6
from
(table2 s
INNER JOIN table3 t
ON s.column2=t.column2 and s.event_time > t.start_time
) a
) b
where rank =1;
问题 1: 我们如何使用 group by 而不是窗口函数来重写上面的查询?
【问题讨论】:
-
该查询是否必须与输出完全匹配?能否给表和列起一些有意义的名称,以便我们更好地把握问题。
-
您需要为
table2和table3提供表定义。列的来源隐藏在(完全没有意义的)子查询a中。 -
@ErwinBrandstetter:您的尝试看起来很合理(出色的逆向工程),但似乎缺少 lag(1) 结果。
-
@wildplasser:我偶然发现了
last_value()表达式。ORDER BY没有定义“最后一个值”。它产生任意的、特定于实现的结果。原始查询实际上已损坏,并且未经 OP 澄清就无法重写。我删除的答案假设太多,一半不正确。 -
表定义和示例数据真的很有帮助。
标签: sql postgresql group-by