我有一个员工表,如下所示:
| 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是最大值?我知道我可以写一个大写的语句,但是我也觉得可以使用联接来完成,但是我不知道。
注意:这是针对postgresql数据库的,但是我也标记了MySQL,因为我知道它也支持LEAST和GREATEST函数。如果两种解决方案都 非常 不同,那么我将删除此注释并提出一个单独的问题。
LEAST
GREATEST
您可以使用以下case语句:
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;