Greatest value of multiple columns with column name?
我正在阅读上面的问题(上面的链接)和“接受”的答案(这似乎是正确的),并且有几个关于这个答案的问题。
(抱歉,我必须创建一个新帖子,没有足够高的声誉来评论旧帖子,因为它看起来很旧)
问题
我的第一个问题是“@var_max_val:=”的意义是什么?没有它我重新查询,一切都运行良好。
我的第二个问题是,有人可以解释这是如何达到预期效果的:
CASE @var_max_val WHEN col1 THEN 'col1'
WHEN col2 THEN 'col2'
...
END AS max_value_column_name
我的第三个问题如下:
似乎在这个“case”语句中,他手动必须为表中的每一列写一行代码(“当x然后y”时)。如果您有1-5列,这很好。但是,如果你有10,000?你会怎么做?
PS:我可能在这篇文章中违反了一些论坛规则,如果我是,请告诉我。 感谢您的阅读,谢谢您的时间!答案 0 :(得分:4)
链接的问题是关于mysql所以它不适用于postgresql(例如@var_max_val
语法特定于mysql)。要在postgresql中完成相同的操作,您可以使用LATERAL
子查询。例如,假设您有以下表格和示例数据:
CREATE TABLE t(col1 int, col2 int, col3 int);
INSERT INTO t VALUES (1,2,3), (5,8,6);
然后,您可以使用以下查询识别每行的最大列:
SELECT *
FROM t, LATERAL (
VALUES ('col1',col1),('col2',col2),('col3',col3)
ORDER BY 2 DESC
LIMIT 1
) l(maxcolname, maxcolval);
产生以下输出:
col1 | col2 | col3 | maxcolname | maxcolval
------+------+------+------------+-----------
1 | 2 | 3 | col3 | 3
5 | 8 | 6 | col2 | 8
我认为这个解决方案比mysql链接文章中提供的解决方案更优雅。
至于不得不手动编写代码,遗憾的是,我认为你无法避免这种情况。
答案 1 :(得分:3)
在Postgres 9.5中,您可以使用jsonb functions来获取列名。在这种情况下,您不必手动编写所有列名称。解决方案需要主密钥(或唯一列)才能正确使用 分组:
create table a_table(id serial primary key, col1 int, col2 int, col3 int);
insert into a_table (col1, col2, col3) values (1,2,3), (5,8,6);
select distinct on(id) id, key, value
from a_table t, jsonb_each(to_jsonb(t))
where key <> 'id'
order by id, value desc;
id | key | value
----+------+-------
1 | col3 | 3
2 | col2 | 8
(2 rows)