假设我有这个表:
- select * from window_test;
- k | v
- ---+---
- a | 1
- a | 2
- b | 3
- a | 4
最终我想得到:
- k | min_v | max_v
- ---+-------+-------
- a | 1 | 2
- b | 3 | 3
- a | 4 | 4
但我会很高兴得到这个(因为我可以轻松地过滤掉它):
- k | min_v | max_v
- ---+-------+-------
- a | 1 | 2
- a | 1 | 2
- b | 3 | 3
- a | 4 | 4
使用Postgresql 9.1窗口函数可以实现这一点吗?我试图理解我是否可以使用单独的分区来表示此样本中第一次和最后一次出现的k = a(按v排序).
这将返回包含样本数据的所需结果.不确定它是否适用于真实世界的数据:
- select k,min(v) over (partition by group_nr) as min_v,max(v) over (partition by group_nr) as max_v
- from (
- select *,sum(group_flag) over (order by v,k) as group_nr
- from (
- select *,case
- when lag(k) over (order by v) = k then null
- else 1
- end as group_flag
- from window_test
- ) t1
- ) t2
- order by min_v;
我遗漏了DISTINCT.