代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

一行中4列之间的最大值

  •  1
  • Harish Shetty  · 技术社区  · 15 年前

    我有 test_scores 包含以下字段的表:

    表架构:

      id (number)
      score1  (number)
      score2  (number)
      score3  (number)
      score4  (number)
    

    样本数据:

    id score1 score2 score3 score4
    1  10     05      30    50
    2  05     15      10    00
    3  25     10      05    15
    

    预期结果集:

    id col_name col_value
    1  score4   50
    2  score2   15
    3  score1   25
    

    什么是好的SQL?(我正在使用MySQL。)

    原始要求没有在行集中包含列名称。我可以使用以下SQL获得结果:

    SELECT   A.id, MAX(A.score) AS max_score
    FROM     (
                SELECT id, score1 as score FROM test_scores UNION
                SELECT id, score2 as score FROM test_scores UNION
                SELECT id, score3 as score FROM test_scores UNION
                SELECT id, score4 as score FROM test_scores
              ) AS A
    GROUP BY A.id
    

    但是,由于在结果集中引入了col_name,我被难住了。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Harish Shetty    15 年前

    我使用以下SQL解决了这个问题:

    SELECT id, GREATEST(score1, score3, score3, score4) AS col_value,
           CASE GREATEST(score1, score3, score3, score4) 
             WHEN score1 THEN 'score1'
             WHEN score2 THEN 'score2'
             WHEN score3 THEN 'score3'
             WHEN score4 THEN 'score4'
           END AS col_name
    FROM test_scores
    
    Please let me know if there is a better solution.
    
        2
  •  2
  •   Sebastian Paaske Tørholm    15 年前

    对于col_值,您需要使用 GREATEST() .

    至于col_名称,您可以这样做,但它并不优雅:

    SELECT id,
           IF(score1 = col_value, 'score1',
           IF(score2 = col_value, 'score2',
           IF(score3 = col_value, 'score3', 'score4'))) AS col_name,
           col_value
    FROM (
        SELECT *, 
               GREATEST(score1, score2, score3, score4) AS col_value
        FROM test_scores
    ) AS helper
    
        3
  •  1
  •   Community CDub    8 年前

    解决方案的一部分( col_value )可能是 SQL MAX of multiple columns? .

        4
  •  1
  •   goat    15 年前

    我更喜欢使用case语句来解释这个问题,但我想我只是为了好玩而发布这个。

    select GREATEST(score1, score2, score3, score4)
         , ELT(FIELD(GREATEST(score1, score2, score3, score4), score1, score2, score3, score4), 'score1', 'score2', 'score3', 'score4')
    from (
        select 11 score1, 6 score2, 7 score3, 8 score4
    ) t