2016-09-08 5 views
0

Greatest value of multiple columns with column name?RE:列名を持つ最大の価値

私は(上記のリンク)と(正しいようだ)「ACCEPTED」の答え上記の質問を読んで、この答えに関するいくつかの質問がありました。

(申し訳ありませんが、私は、新しいポストを作成する必要があり、それは非常に古いようだとして、古い記事にコメントするには十分に高い評判を持っていない)

質問
私の最初の質問が何であるかであります"@var_max_val:="の意義?私はそれを使わずに質問を出し、すべてうまくいった。

CASE @var_max_val WHEN col1 THEN 'col1' 
        WHEN col2 THEN 'col2' 
        ... 
    END AS max_value_column_name 

私の3番目の質問は次のとおりです。:

この「ケース」文で彼は、手動で書くことがあるようです

私の2番目の質問は、誰かが、これはそれが必要だ結果を達成する方法を説明することができますです表の各列のコード行(「xとyの間」) 1〜5列の場合はこれで問題ありません。しかし、もしあなたが10,000人いたら?それについてどうやって行きますか?


PS:私はこの記事のいくつかのフォーラムルールに違反している可能性があります。 お読みいただきありがとうございます、ありがとうございます!

答えて

3

リンクされた質問はmysqlに関するものなので、postgresqlには適用されません(例:@var_max_valの構文はmysqlに固有です)。 postgresqlで同じことを達成するには、サブクエリLATERALを使うことができます。

SELECT * 
FROM t, LATERAL (
      VALUES ('col1',col1),('col2',col2),('col3',col3) 
      ORDER BY 2 DESC 
      LIMIT 1 
     ) l(maxcolname, maxcolval); 

次の出力を生成する:

CREATE TABLE t(col1 int, col2 int, col3 int); 
INSERT INTO t VALUES (1,2,3), (5,8,6); 

はその後次のクエリと各行の最大列を識別することができる:たとえば、以下の表とサンプルデータを有すると仮定する

col1 | col2 | col3 | maxcolname | maxcolval 
------+------+------+------------+----------- 
    1 | 2 | 3 | col3  |   3 
    5 | 8 | 6 | col2  |   8 

このソリューションは、mysqlのリンク記事で紹介されているものよりはるかにエレガントだと思います。

コードを手作業で書かなければならないのは残念ながら、私はあなたがそれを避けることはできないと思います。

+0

ちょうど簡単なメモを、この 'MAX_VALUE AS GREATEST(COL1、COL2、COL3、...)、 CASE SELECT – OctaveParango

+1

'GREATEST'機能は、PostgreSQLに存在しないのpostgresのcol1 THEN 'COL1' FROM table_nameをmax_value_column_name のように 'COL2' ... ENDをCOL2 WHERE ...' 作品が、リンク先の記事にもmysqlに固有のユーザー定義変数を使用します。 – redneb

+0

OKです。私はあなたを誤解しました。 – OctaveParango

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) 
+0

エラー 'ERROR:関数to_jsonb(a_table)が存在しません SQLの状態:42883' – Paarth

+0

@Paarth' to_jsonb'が9.5で追加されました。あなたはそのバージョンを使用していますか? – redneb

関連する問題