【发布时间】:2021-04-08 22:52:15
【问题描述】:
这里 amenity_category 和 parent_path 列是 JSONB 列,其值分别类似于 ["Tv","Air Condition"] 和 ["20000","20100","203"]。除此之外,其他列是普通的varchar 和numeric 类型。我在id 上有大约 250 万行 主键,它已被索引。基本上,当 rp.parent_path 匹配多行时,初始 CTE 部分需要时间。
样本数据集:
当前查询:
WITH CTE AS
(
SELECT id,
property_name,
property_type_category,
review_score,
amenity_category.name,
count(*) AS cnt FROM table_name rp,
jsonb_array_elements_text(rp.amenity_categories) amenity_category(name)
WHERE rp.parent_path ? '203' AND number_of_review >= 1
GROUP BY amenity_category.name,id
),
CTE2 as
(
SELECT id, property_name,property_type_category,name,
ROW_NUMBER() OVER (PARTITION BY property_type_category,
name ORDER BY review_score DESC),
COUNT(id) OVER (PARTITION BY property_type_category,
name ORDER BY name DESC)
FROM CTE
)
SELECT id, property_name, property_type_category, name, COUNT
FROM CTE2
where row_number = 1
电流输出:
所以我的基本问题是有没有其他方法可以重写此查询或优化当前查询?
【问题讨论】:
-
请描述你想要做什么。
-
@GordonLinoff 先生,我正在尝试计算每个 property_type_categories 及其舒适组合窗口的数量,并在每个窗口上获取顶部 id 和 property_name。
-
例如,如果您看到输出,类别:客舱和便利设施:电视的计数为 273,我从 273 中获取 TOP ROW 的
id, property_name值
标签: sql postgresql common-table-expression window-functions jsonb