【问题标题】:Limit per some field每个字段的限制
【发布时间】:2016-06-20 10:33:54
【问题描述】:

假设我们有这样一个 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 30

到目前为止,我们必须对几个resort_id 进行多次查询。
如何更改查询,以便我们只有一个查询(WHERE resort_id in (612, 333, 111),结果每个resort_id 不超过30 个项目?

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

    使用ROW_NUMBER 计算每个resort_id 的行数。

    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;
    

    【讨论】:

      【解决方案2】:

      您可以将CTEROW_NUMBER()PARTITION BY 一起使用

      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
      

      【讨论】:

      • 不按分区排序结果是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2013-10-08
      • 1970-01-01
      • 2019-04-22
      • 2020-10-08
      相关资源
      最近更新 更多