sql - 使用别名的 ORDER BY 中的 Postgres CASE

标签 sql postgresql sql-order-by aggregate-functions case

我有以下在 Postgres 9.1 中运行良好的查询:

SELECT users.id, GREATEST(
 COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'),
 COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117')
) AS latest_interaction
FROM users LEFT JOIN messages ON users.id = messages.user_id
LEFT JOIN phone_calls ON users.id = phone_calls.user_id
GROUP BY users.id
ORDER BY latest_interaction DESC
LIMIT 5;

但是我想做的是这样的:

SELECT users.id, GREATEST(
 COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'),
 COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117')
) AS latest_interaction
FROM users LEFT JOIN messages ON users.id = messages.user_id
LEFT JOIN phone_calls ON users.id = phone_calls.user_id
GROUP BY users.id
ORDER BY
  CASE WHEN(
    latest_interaction > '2012-09-05 16:05:41.870117')
  THEN 0
  WHEN(latest_interaction > '2012-09-04 16:05:41.870117')
  THEN 2
  WHEN(latest_interaction > '2012-09-04 16:05:41.870117')
  THEN 3
  ELSE 4
  END
LIMIT 5;

我收到以下错误: 错误:列“latest_interaction”不存在

看来我不能在带有 CASE 语句的 order by 子句中使用聚合 latest_interaction 的别名。

是否有任何解决方法?

最佳答案

尝试将其包装为子查询:

SELECT * 
FROM 
(
    SELECT users.id, 
        GREATEST(
             COALESCE(MAX(messages.created_at), '2012-07-25 16:05:41.870117'),
             COALESCE(MAX(phone_calls.created_at), '2012-07-25 16:05:41.870117')
        ) AS latest_interaction
        FROM users LEFT JOIN messages ON users.id = messages.user_id
        LEFT JOIN phone_calls ON users.id = phone_calls.user_id
        GROUP BY users.id
) Sub
ORDER BY
  CASE WHEN(
    latest_interaction > '2012-09-05 16:05:41.870117')
  THEN 0
  WHEN(latest_interaction > '2012-09-04 16:05:41.870117')
  THEN 2
  WHEN(latest_interaction > '2012-09-04 16:05:41.870117')
  THEN 3
  ELSE 4
  END
LIMIT 5;

关于sql - 使用别名的 ORDER BY 中的 Postgres CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298421/

相关文章:

MySql 选择不工作

mysql - 替换 MySQL 数据库中的\n\r

一个特定字段没有重复值的 SQL Union

mysql按多个条件排序

带有 LEFT JOIN (SELECT) ORDER 和 LIMIT 的 MySQL 查询

java - 通过与旧值进行比较来拦截 DB 中的字段是否已使用 JAVA 更改

c# - 如何在 SQL 中获取一行行?

mysql - 如何在 Postgresql 中为每个用户创建顺序 ID

sql - 获取主键顺序中的下一个id

javascript - 在 php 中从 mysql 订购数据时排除引用