Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获取最小函数结果的列名?_Mysql_Sql_Postgresql - Fatal编程技术网

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

Mysql 如何获取最小函数结果的列名?,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有一个employee表,如下所示: | 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的问题的最小值和最大值。在这种

我有一个employee表,如下所示:

| 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语句,但我也觉得可以使用join来完成,但我无法理解

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

编辑


我已经有了。

您可以使用
案例
语句:

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
SELECT CASE LEAST(q1, q2, q3, q4)
          WHEN q1 THEN 'q1'
          WHEN q2 THEN 'q2'
          WHEN q3 THEN 'q3'
          ELSE 'q4'
       END as chosen_item
(注意:它将在领带上丢失信息。)

如果您对TIE感兴趣,那么使用子查询和数组来实现它就可以了:

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;

您可以使用
案例
语句:

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
SELECT CASE LEAST(q1, q2, q3, q4)
          WHEN q1 THEN 'q1'
          WHEN q2 THEN 'q2'
          WHEN q3 THEN 'q3'
          ELSE 'q4'
       END as chosen_item
(注意:它将在领带上丢失信息。)

如果您对TIE感兴趣,那么使用子查询和数组来实现它就可以了:

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;

我将使用CASE语句来比较每一列的最大值,直到找到匹配项为止

不完美,因为它不会很快,而且当多个列共享相同的最大值时,它也只会找到第一列:-

SELECT id, 
    name,
    LEAST(q1, q2, q3, q4) AS minValue,
    CASE LEAST(q1, q2, q3, q4)
        WHEN q1 THEN 'q1'
        WHEN q2 THEN 'q2'
        WHEN q3 THEN 'q3'
        ELSE 'q4'
    END,
    GREATEST(q1, q2, q3, q4) AS maxValue,
    CASE GREATEST(q1, q2, q3, q4)
        WHEN q1 THEN 'q1'
        WHEN q2 THEN 'q2'
        WHEN q3 THEN 'q3'
        ELSE 'q4'
    END
FROM employee
WHERE id = 4;
编辑-使用连接,我怀疑这会更糟:-

SELECT a0.id, 
    a0.name,
    LEAST(a0.q1, a0.q2, a0.q3, a0.q4) AS minValue,
    CASE 
        WHEN a1.id IS NULL THEN 'q1'
        WHEN a2.id IS NULL THEN 'q2'
        WHEN a3.id IS NULL THEN 'q3'
        ELSE 'q4'
    END,
    GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) AS maxValue,
    CASE GREATEST(q1, q2, q3, q4)
        WHEN a15.id IS NULL THEN 'q1'
        WHEN a16.id IS NULL THEN 'q2'
        WHEN a17.id IS NULL THEN 'q3'
        ELSE 'q4'
    END
FROM employee a0
LEFT OUTER JOIN employee a1 ON a0.id = a1.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a1.q1 
LEFT OUTER JOIN employee a2 ON a0.id = a2.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a2.q2 
LEFT OUTER JOIN employee a3 ON a0.id = a3.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a3.q3 
LEFT OUTER JOIN employee a4 ON a0.id = a4.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a4.q4 
LEFT OUTER JOIN employee a11 ON a0.id = a11.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a1.q11 
LEFT OUTER JOIN employee a12 ON a0.id = a12.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a2.q12 
LEFT OUTER JOIN employee a13 ON a0.id = a13.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a3.q13 
LEFT OUTER JOIN employee a14 ON a0.id = a14.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a4.q14 
WHERE a0.id = 4;

我将使用CASE语句来比较每一列的最大值,直到找到匹配项为止

不完美,因为它不会很快,而且当多个列共享相同的最大值时,它也只会找到第一列:-

SELECT id, 
    name,
    LEAST(q1, q2, q3, q4) AS minValue,
    CASE LEAST(q1, q2, q3, q4)
        WHEN q1 THEN 'q1'
        WHEN q2 THEN 'q2'
        WHEN q3 THEN 'q3'
        ELSE 'q4'
    END,
    GREATEST(q1, q2, q3, q4) AS maxValue,
    CASE GREATEST(q1, q2, q3, q4)
        WHEN q1 THEN 'q1'
        WHEN q2 THEN 'q2'
        WHEN q3 THEN 'q3'
        ELSE 'q4'
    END
FROM employee
WHERE id = 4;
编辑-使用连接,我怀疑这会更糟:-

SELECT a0.id, 
    a0.name,
    LEAST(a0.q1, a0.q2, a0.q3, a0.q4) AS minValue,
    CASE 
        WHEN a1.id IS NULL THEN 'q1'
        WHEN a2.id IS NULL THEN 'q2'
        WHEN a3.id IS NULL THEN 'q3'
        ELSE 'q4'
    END,
    GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) AS maxValue,
    CASE GREATEST(q1, q2, q3, q4)
        WHEN a15.id IS NULL THEN 'q1'
        WHEN a16.id IS NULL THEN 'q2'
        WHEN a17.id IS NULL THEN 'q3'
        ELSE 'q4'
    END
FROM employee a0
LEFT OUTER JOIN employee a1 ON a0.id = a1.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a1.q1 
LEFT OUTER JOIN employee a2 ON a0.id = a2.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a2.q2 
LEFT OUTER JOIN employee a3 ON a0.id = a3.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a3.q3 
LEFT OUTER JOIN employee a4 ON a0.id = a4.id AND LEAST(a0.q1, a0.q2, a0.q3, a0.q4) = a4.q4 
LEFT OUTER JOIN employee a11 ON a0.id = a11.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a1.q11 
LEFT OUTER JOIN employee a12 ON a0.id = a12.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a2.q12 
LEFT OUTER JOIN employee a13 ON a0.id = a13.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a3.q13 
LEFT OUTER JOIN employee a14 ON a0.id = a14.id AND GREATEST(a0.q1, a0.q2, a0.q3, a0.q4) = a4.q14 
WHERE a0.id = 4;

下面将显示最大值和最小值。它还将显示共享的最大值和最小值。 如果最大值和最小值恰好相同,它将下降。(例如所有值都相同)


下面将显示最大值和最小值。它还将显示共享的最大值和最小值。 如果最大值和最小值恰好相同,它将下降。(例如所有值都相同)

使用语句:

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
SELECT CASE LEAST(q1, q2, q3, q4)
          WHEN q1 THEN 'q1'
          WHEN q2 THEN 'q2'
          WHEN q3 THEN 'q3'
          ELSE 'q4'
       END as chosen_item
如果是平局,将报告列表中的第一项。

使用以下语句:

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
SELECT CASE LEAST(q1, q2, q3, q4)
          WHEN q1 THEN 'q1'
          WHEN q2 THEN 'q2'
          WHEN q3 THEN 'q3'
          ELSE 'q4'
       END as chosen_item

如果是平局,将报告列表中的第一项。

我知道为了简单起见,您缩短了问题的篇幅,但如果将来的用户在“q4”中使用
ELSE
,可能会有所帮助,因为您无法在
语句时获得所有
。谢谢您的编辑。打破僵局的标准是什么?它是否第一次出现该值?请尝试我列出的第二个查询(不包括with部分):它将构建一个数组,其中包含适用于平局的所有问题的名称。(因为
v=least(q1、q2、q3、q4)
)好的,这真的很酷。我从未使用过数组函数,这实际上对我帮助很大。以下是更新后包含的内容。你知道MySQL是否也支持它吗?它不支持。MySQL缺乏大量Postgres功能。我知道为了简单起见,您缩短了问题的篇幅,但对于未来的用户来说,在“q4”中使用
ELSE
可能会有所帮助,因为您无法在
语句时获得所有
。谢谢您的编辑。打破僵局的标准是什么?它是否第一次出现该值?请尝试我列出的第二个查询(不包括with部分):它将构建一个数组,其中包含适用于平局的所有问题的名称。(因为
v=least(q1、q2、q3、q4)
)好的,这真的很酷。我从未使用过数组函数,这实际上对我帮助很大。以下是更新后包含的内容。你知道MySQL是否也支持它吗?它不支持。MySQL缺少很多Postgres的功能。是的,这一点已经过时了。你认为有更快的解决方案吗?我认为可能会有一个连接解决方案,但它可能比这复杂得多,这样的连接的可维护性可能不值得,与这样可读且易于理解的东西相比。我不确定我是否能想出一种干净有效的方法来使用连接,虽然我添加了一个可怕的方式做它!是的,看起来更糟,哈哈。(不过,这不是你的错)。我认为案例陈述在这里是最好的。而且,即使有连接,我们也使用了case语句。因此,在这一点上,为什么还要为连接费心呢?
最小
最大
运算符与连接相比并不昂贵:它们应用于行本身中可用的值——因此这都是cpu时间——在这种特殊情况下,它们只针对与where子句匹配的行进行计算。是的,这是错误的。你认为有更快的解决方案吗?我认为可能会有一个连接解决方案,但它可能比这复杂得多,这样的连接的可维护性可能不值得,与这样可读且易于理解的东西相比。我不确定我是否能想出一种干净有效的方法来使用连接,虽然我添加了一个可怕的方式做它!是的,看起来更糟,哈哈。(不过,这不是你的错)。我认为案例陈述在这里是最好的。而且,即使有连接,我们也使用了case语句。那么在这一点上,为什么还要为连接费心呢?
最小的
最大的
运算符与连接相比并不昂贵:它们应用于行本身中可用的值——因此都是cpu时间——在这种特殊情况下,它们只对与where子句匹配的行进行计算。这样做,我唯一担心的是,我必须与其他人讨论的是,它将返回非最小值或最大值问题的空单元格,我不知道我们是否希望这样。但是,+1表示工作解决方案。如果愿意,可以更改查询以显示值。这取决于它的用途。如