mysql - 如何获取最小函数结果的列名?

标签 mysql sql postgresql

我有一个员工表,如下所示:

| id | name | q1 | q2 | q3 | q4 |
+----+------+----+----+----+----+
| 1  | John | 20 | 30 | 10 | 4  |
| 2  | Ram  | 07 | 10 | 03 | 4  |
| 3  | John | 05 | 03 | 15 | 40 |
| 4  | Sree | 12 | 05 | 20 | 25 |

我需要获取 id 等于 4 的问题的最小值和最大值。在本例中,我需要返回 5 和 25。我使用以下查询实现了这一点:

SELECT id, name,
  LEAST(q1, q2, q3, q4) AS minValue,
  GREATEST(q1, q2, q3, q4) AS maxValue
FROM employee
WHERE id = 4;

但这不会返回问题 ID。如何调整查询以显示 q2 是最小值而 q4 是最大值?我知道我可以写一个大的 case 语句,但我也觉得它可以使用连接来完成,但我想不出来。

注意:这是针对 postgresql 数据库的,但我也标记了 MySQL,因为我知道它也支持 LEASTGREATEST 函数。如果两者的解决方案非常不同,那么我将删除此注释并提出一个单独的问题。

编辑

我有一个 SQL Fiddle已经。

最佳答案

您可以使用 case 语句:

CASE
WHEN LEAST(q1, q2, q3, q4) = q1 THEN 'q1'
WHEN LEAST(q1, q2, q3, q4) = q2 THEN 'q2'
WHEN LEAST(q1, q2, q3, q4) = q3 THEN 'q3'
ELSE 'q4'
END as minQuestion

(注意:它会丢失关系上的信息。)

如果您对关系感兴趣,可以使用子查询和数组来处理它:

with employee as (
  select id, q1, q2, q3, q4
  from (values
    (1, 1, 1, 3, 4),
    (2, 4, 3, 1, 1)
  ) as rows (id, q1, q2, q3, q4)
)

SELECT least(q1, q2, q3, q4),
       array(
         select q
         from (values (q1, 'q1'),
                      (q2, 'q2'),
                      (q3, 'q3'),
                      (q4, 'q4')
              ) as rows (v, q)
         where v = least(q1, q2, q3, q4)
       ) as minQuestions
FROM employee e
WHERE e.id = 1;

关于mysql - 如何获取最小函数结果的列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567600/

相关文章:

sql - 查询不同表的数据

java - DataSource 和 ConnectionPoolDataSource 的区别

php - SQL表中没有行时输出 "any"的值

mysql - 使用 JOIN 在多个表上自由搜索

mysql - 如何选择具有多个连接子句的平均值?

SQL - 如何根据不同表中的值选择行?

mysql - 创建时间戳为同一天的新表

php - 比较每行数据的表字段并采取一些措施 (PHP)

Postgresql:创建表时 UNION ALL 比 UNION 慢?

postgresql - PostgreSQL 中奇怪的幽灵记录——它们是什么?