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

标签 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 - 名字 - 排名

事件 id - organization_id - 名称 - 状态(2 = 当前正在发生,1 = 即将发生,0 = 无)

正如我所说,状态列仅包含 2、1 或 0,我相信这使得执行 ORDER BY 成为可能

如果有人能写一个示例查询,我将不胜感激!我无法按状态对事件进行排序,然后同时按级别对这些事件的组织进行排序。

最佳答案

例子:

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 开始有效。

关于sql - 在一个查询中实现多个排序和限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150275/

相关文章:

sql - pgSQL 上的括号错误

mysql - 检查特定行上的值是否为 NULL

sql - 如何在oracle中将可空列设置为NOT NULL

MySQL,选择具有许多一对多关系的条目的最佳方法?

php - 在 null LARAVEL 上调用成员函数 update()

java - PSQL异常 : This connection has been closed - Spring Boot + AWS RDS + Postgres

database - DBI:如何为未知数据找到正确的数据类型?

database - 在数据库事务中读取查询

postgresql - postgis拓扑中的CreateTopology()中的SRID

ruby-on-rails - 使用 RoR 停止在 Heroku 上看到 SQL 级别的日志