SQL:从一行的一列中获取至少第三大值

Vis*_*mar 6 mysql sql database

我需要一个SQL查询来从一行列中获取第二大值.例如,如果这些是我的表的行:

id | col1 | col2 | col3 | col4 | coln |
1  |   5  |   7  |   9  |  3   |  10  |
2  |   13 |   14 |   2  |  54  |  11  |
Run Code Online (Sandbox Code Playgroud)

对于rowid 1 - 我需要值9,rowid 2 - 我需要值14

Luk*_*der 5

我担心,如果没有公用表表达式和/或窗口函数,并且不需要编写过程,这在MySQL中会变得非常冗长

SELECT t.id, t.val second_largest
-- unpivot your columns into a table
FROM (
  SELECT id, col1 val FROM my_table UNION ALL
  SELECT id, col2     FROM my_table UNION ALL
  SELECT id, col3     FROM my_table UNION ALL
  SELECT id, col4     FROM my_table UNION ALL
  SELECT id, coln     FROM my_table
) t

-- retain only those records, where there exists exactly one record with a
-- column value greater than any other column value with the same id
WHERE 1 = (
  SELECT COUNT(*) 
  -- Here, use unions to be sure that every value appears exactly once
  FROM (
    SELECT id, col1 val FROM my_table UNION
    SELECT id, col2     FROM my_table UNION
    SELECT id, col3     FROM my_table UNION
    SELECT id, col4     FROM my_table UNION
    SELECT id, coln     FROM my_table
  ) u
  WHERE t.id = u.id
  AND t.val < u.val
)
Run Code Online (Sandbox Code Playgroud)

这是检查它的SQLFiddle(感谢bluefeet对于模式的抬头!).即使最大列值出现多次,上述解决方案也会在每一行中找到第二大列值.