Postgresql RE:列名称为的最大值
我正在阅读上面链接的问题和公认的答案,这些答案似乎是正确的,关于这个答案我有几个问题 很抱歉,我必须创建一个新的帖子,没有足够高的声誉来评论旧帖子,因为它看起来很旧 问题 我的第一个问题是@var_max_val:=的意义是什么?我在没有它的情况下重新运行了查询,一切正常 我的第二个问题是,有人能解释一下这是如何达到预期效果的:Postgresql RE:列名称为的最大值,postgresql,Postgresql,我正在阅读上面链接的问题和公认的答案,这些答案似乎是正确的,关于这个答案我有几个问题 很抱歉,我必须创建一个新的帖子,没有足够高的声誉来评论旧帖子,因为它看起来很旧 问题 我的第一个问题是@var_max_val:=的意义是什么?我在没有它的情况下重新运行了查询,一切正常 我的第二个问题是,有人能解释一下这是如何达到预期效果的: CASE @var_max_val WHEN col1 THEN 'col1' WHEN col2 THEN 'col2'
CASE @var_max_val WHEN col1 THEN 'col1'
WHEN col2 THEN 'col2'
...
END AS max_value_column_name
我的第三个问题如下:
似乎在这个case语句中,当x然后y为表中的每一列时,他必须手动编写一行代码。如果您有1-5列,这是很好的。但是如果你有10000呢?你会怎么做
附言:我可能在这篇文章中违反了一些论坛规则,如果我违反了,一定要让我知道。
谢谢你的阅读,谢谢你的时间 链接的问题是关于mysql的,因此它不适用于postgresql,例如@var_max_val语法是mysql特有的。要在postgresql中实现同样的功能,可以使用横向子查询。例如,假设您有以下表格和示例数据:
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链接文章中介绍的要优雅得多
至于必须手动编写代码,不幸的是,我不认为您可以避免这种情况。在Postgres 9.5中,您可以使用来获取列名。在这种情况下,您不必手动写入所有列的名称。该解决方案需要一个主键或一个唯一的列才能正确执行 分组:
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)
只是一个简短的提示,这个“选择最伟大的col1,col2,col3。。。作为最大_值,当col1然后是“col1”,当col2然后是“col2”。。。结束为max_value_column_name FROM table_name WHERE…`在Postgres中工作postgresql中确实存在最大的函数,但链接的文章也使用特定于mysql的用户定义变量。获取错误:函数到_jsonba_table不存在SQL状态:42883@Paarthjsonb是在9.5中添加的,您使用的是该版本吗?