首页 > 解决方案 > SQL 查询 2 限制

问题描述

我有以下问题,我想限制返回的项目总数,同时将一个值限制为一定数量

我做这样的查询

select * from messages order by m.priority ASC limit 5;

现在我想做以下事情,我有一个名为 running 的字段,我希望能够说在这些结果中我希望有最大 n 个未运行的结果,例如 2,但我仍然想得到 5 个结果基于优先级

因此,如果我在数据库中有以下数据:

priority  | running  
----------+---------
      1   | true 
      2   | false
      3   | false 
      4   | false
      5   | false 
      6   | true
      7   | true 
      8   | true

我的总限制为 5,非运行限制为 2 我希望得到以下结果

priority  | running  
----------+---------
      1   |  true 
      2   |  false
      6   |  true
      7   |  true 
      8   |  true

有人建议如何在 PostgreSQL 中执行此操作吗?

更新:我得到了根据@Gordon Linoff 回答给出我想要的结果的查询

select m.*
  from (select t.*,
               row_number() over (partition by t.running order by t.priority) as seqnum
          from message t) m
 where ((not m.running and seqnum <= 2) or (m.running and seqnum <= 5)) order by m.priority limit 5;

链接http://sqlfiddle.com/#!17/98477/1

标签: sqlpostgresql

解决方案


我想你想要:

select m.*
from (select m.*,
             row_number() over (partition by running order by m.priority) as seqnum
      from messages
     ) m
where ((not m.running and seqnum <= 2) or
       (m.running and seqnum <= 3)
      );

这里 3 = 5 - 2。


推荐阅读