从透视图中的另一个col值中筛选varchar col



我有一个如下表:

updated_on由创建2021年3月21日2021年4月15日移动电话号码2021年4月21日办公编号<2378783>
object_key 属性类型值名称value_num
1 user1姓名John
1 用户4用户34567865
1 用户3用户2

可以通过单个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;

相关内容

  • 没有找到相关文章

最新更新