Ada*_*331 1 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 |
Run Code Online (Sandbox Code Playgroud)
我需要获取 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;
Run Code Online (Sandbox Code Playgroud)
但是这不会返回问题ID。如何调整我的查询以显示 q2 是最小值,q4 是最大值?我知道我可以写一个大的 case 语句,但我也觉得它可以使用连接来完成,但我无法弄清楚。
注意:这是针对 postgresql 数据库的,但我也标记了 MySQL,因为我知道它也支持LEAST和GREATEST函数。如果两者的解决方案非常不同,那么我将删除此注释并提出一个单独的问题。
编辑
我已经有一个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
Run Code Online (Sandbox Code Playgroud)
(注意:它会因为关系丢失信息。)
如果您对关系感兴趣,可以使用子查询和数组来处理它:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1222 次 |
| 最近记录: |