在一个查询中实现多个排序和限制

时间:2012-08-27 22:06:00

标签: sql database postgresql

我需要创建一个查询,显示按组织排名顺序减少的组织顺序。 但是,如果组织有一个当前正在发生的事件,它们将显示在顶部(按排名排序) 然后显示即将举办的活动的组织 最后,显示没有发生任何事情的组织。

组织可以同时拥有当前正在发生的事件和即将发生的事件,并且每个事件都有多个,但它只选择一个事件,而组织只显示在类别

目前正在发生的事情优先于未来,因此只有当前正在发生和即将发生的事件时,该组织才会出现在当前正在发生的事件

以下是输出应该是

的示例

目前正在发生

  • 组织1(等级3) - 事件1
  • 组织2(等级2) - 事件2
  • 组织3(等级1) - 事件3

待办

  • 组织5(等级3) - 事件4
  • 组织4(等级2) - 事件5
  • 组织6(等级2) - 事件6

没有

  • 组织7(等级3) - 事件7
  • 组织8(等级2) - 事件8
  • 组织9(等级2) - 事件9

以下是一个示例表设置

组织 id - name - rank

活动 id - organization_id - name - status(2 =当前正在发生,1 =即将发生,0 =什么都没有)

状态栏只包含2,1或0,正如我所说,我认为可以进行ORDER BY

如果有人可以编写示例查询,我将非常感谢!我在按状态排序事件时遇到问题,然后按照他们的排名同时对这些事件的组织进行排序。

1 个答案:

答案 0 :(得分:1)

示例:

SELECT o.*, max(e.status) AS org_status
FROM   organization o
JOIN   event e ON e.organiszation_id = o.organization_id
GROUP  BY o.organization_id
ORDER  BY org_status DESC, o.rank DESC, o.name;

请注意,我使用organization_id作为organization的主键,因为在整个数据库的多个表中使用非描述性名称id是一种反模式。

o.organization_id是主键的事实也让我只能GROUP BY o.organization_id - 这可以从PostgreSQL 9.1开始。