一种方法是使用窗口函数
我有一个如下表:
object_key | 由 | updated_on由属性类型 | 值名称 | value_num |
---|---|---|---|---|
1 | user1 | 2021年3月21日姓名 | John | |
1 | 用户4 | 2021年4月15日用户3 | 移动电话号码4567865 | |
1 | 用户3 | 2021年4月21日用户2 | 办公编号<2378783>
可以通过单个SELECT
将窗口函数与DISTINCT ON
:组合来实现
适用于最终在您的小提琴中公开的表格定义:
SELECT DISTINCT ON (object_key)
object_key
, first_value(created_by) OVER w AS created_by
, updated_on
, updated_by
, min(array_to_string(value_name, '||')) FILTER (WHERE attr_type = 'Name' ) OVER w AS "Name"
, min(array_to_string(value_num , '||')) FILTER (WHERE attr_type = 'Mobile_number') OVER w AS "Mobile_number"
, min(array_to_string(value_num , '||')) FILTER (WHERE attr_type = 'Office_number') OVER w AS "Office_number"
-- , min(array_to_string(value_name, '||')) FILTER (WHERE attr_type = 'status' ) OVER w AS status -- ??
FROM object_attributes
WHERE object_key IN (1,2)
WINDOW w AS (PARTITION BY object_key ORDER BY updated_on)
ORDER BY object_key, updated_on DESC NULLS LAST;
db<gt;小提琴这里
这是有效的,因为DISTINCT ON
应用于窗口函数之后的。考虑SELECT
查询中的事件序列:
- 在应用LIMIT之前获得结果计数的最佳方法
我们可以在聚合窗口函数中使用FILTER
子句。参见:
- PostgreSQL
- 如何将时间戳分组为孤岛(基于任意间隙(
WINDOW
子句是可选的,可以缩短代码,您也可以将其拼写为我们的4x,结果相同。
为什么您可能需要NULLS LAST
:
- 按ASC列排序,但先为NULL值
相关:
- 从每组的第一行和最后一行获取值
- 选择每个GROUP BY组中的第一行
first_value
:
SELECT
object_key,
max(created_on) AS created_on,
max(updated_on) AS updated_on,
first_value(updated_by) over(order updated_on desc) AS updated_by,
max(array_to_string(value_name,'||')) FILTER (WHERE attr_type = 'name' )as name,
max(array_to_string(value_num, '||')) FILTER (WHERE attr_type = 'mobile_number') AS mobile_number,
max(array_to_string(value_num, '||')) FILTER (WHERE attr_type = 'office_number') AS office_number
FROM object_attributes
GROUP BY object_key;