我在面试中被问到这个问题,我已经知道我们可以使用 CASE/oracle 的最大功能。 但是面试官想要一个答案,如果添加了新列,我们不必更改查询。 例如
Student English history maths
zzzz 85 55 66
yyyy 47 99 55
预期结果:-
zzzzz English :85
yyyyy history :99
现在如果表被改变,相同的查询应该可以工作
Student English history maths science
zzzz 85 55 66 86
yyyy 47 99 55 11
预期结果:-
zzzzz science :86
yyyyy history :99
最佳答案
您可以使用 unpivot 在 Oracle 中获得答案:
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY student ORDER BY total DESC ) AS rn
FROM your_table
UNPIVOT ( total FOR subject IN ( english, maths, history ) ) t
)
WHERE rn = 1;
但是您需要将新列名添加到 UNPIVOT
的 IN
子句中。
但是,如果您要使用动态 SQL,那么您可以使用数据字典(即 USER_TAB_COLUMNS
表)构建那部分查询:
DECLARE
column_names CLOB;
sql CLOB;
BEGIN
SELECT LISTAGG(
column_name,
','
) WITHIN GROUP ( ORDER BY column_id )
INTO column_names;
FROM user_tab_columns
WHERE table_name = 'YOUR_TABLE'
AND column_name <> 'STUDENT';
sql := 'SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY student ORDER BY total DESC ) AS rn FROM your_table UNPIVOT ( total FOR subject IN ( ' || column_names || ' ) ) t ) WHERE rn = 1;'
EXECUTE IMMEDIATE sql;
END;
/
关于mysql - 检查表列的最大值,表列未知/常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45794932/