Sql 每个字段的限制
假设我们有这样一个sql查询,其中包含来自另一个表的连接数据Sql 每个字段的限制,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,假设我们有这样一个sql查询,其中包含来自另一个表的连接数据 SELECT pr.num, pr.resort_id, p.src_mask FROM rutraveler.rt_photo_resort AS pr JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id WHERE pr.resort_id = '612' AND p.src_mask is not null ORDER BY num LIMIT
SELECT
pr.num, pr.resort_id, p.src_mask
FROM
rutraveler.rt_photo_resort AS pr
JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id
WHERE pr.resort_id = '612' AND p.src_mask is not null
ORDER BY num
LIMIT 30
到目前为止,我们必须对几个度假村id进行几次查询。
如何更改查询,使我们只有一个查询,其中resort\u id位于612、333、111中,每个resort\u id的结果不超过30个项目?使用ROW\u NUMBER统计每个resort\u id的行数
您可以使用带有行号和分区的CTE
如果没有分区排序,结果是错误的。
SELECT resort_id, num, resort_id, src_mask
FROM
(
SELECT
pr.resort_id, pr.num, pr.resort_id, p.src_mask,
ROW_NUMBER() OVER (PARTITION BY pr.resort_id ORDER BY num) AS rn
FROM
rutraveler.rt_photo_resort AS pr
JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id
WHERE resort_id in (612, 333, 111) AND p.src_mask is not null
) data
WHERE rn <= 30
ORDER BY resort_id, num;
WITH Results_CTE AS
(
SELECT
pr.num, pr.resort_id, p.src_mask,ROW_NUMBER() over ( PARTITION BY pr.resort_id ORDER BY num) As Row_number
FROM
rutraveler.rt_photo_resort AS pr
JOIN rutraveler.rt_photo AS p ON pr.photo_id = p.id
WHERE pr.resort_id IN (A,B,C) AND p.src_mask is not null
)
SELECT *
FROM Results_CTE
WHERE Row_number <= 30