从行窗口获取最大值作为所有行的新列

时间:2019-03-29 15:15:33

标签: sql amazon-redshift window-functions

int counter = 0;
foreach(var card in this.Controls.OfType<Card>())
{
    card.Id = ++counter;
}

如何在| col 1 | col 2 | col 3 | |-------|-------|-------| | 67458 | ADM | 1008 | | 67458 | ADM | 1009 | | 67458 | SKI | 1009 | | 67458 | LIS | 1010 | | 67458 | TOU | 1121 | 时获取col3的最大值并将其用作其余记录的值?

预期结果:

col2='ADM'

我知道如何使用子选择和全部选择。 | col 1 | col 2 | col 3 | col 4 | |-------|-------|-------|-------| | 67458 | ADM | 1008 | 1009 | | 67458 | ADM | 1009 | 1009 | | 67458 | SKI | 1009 | 1009 | | 67458 | LIS | 1010 | 1009 | | 67458 | TOU | 1121 | 1009 | 是一个伪列,将在下游用于JOIN和填充。

我尝试了以下操作,但填充了 1121 而不是 1009

col4

4 个答案:

答案 0 :(得分:1)

您可以使用相关子查询:

select t.*,
       (select max(t1.col3) from table t1 where t1.col1 = t.col1 and t1.col2 = 'ADM') as col4
from table t;

答案 1 :(得分:1)

使用窗口功能:

select t.*,
       max(col3) filter (where col2 = 'ADM') over (partition by col1) as col4
from t;

在Redshift中,您可能必须使用case

select t.*,
       max(case when col2 = 'ADM' then col3 end) over (partition by col1) as col4
from t;

答案 2 :(得分:0)

您可以在func('www.google.com')中使用子查询来获取该值。

如果您想一次又一次地执行并交叉连接,则可以将此suq查询存储在变量中。

架构(PostgreSQL v10.0)

SELECT

查询#1

CREATE TABLE test (
  "col 1" INTEGER,
  "col 2" VARCHAR(3),
  "col 3" INTEGER
);

INSERT INTO test
  ("col 1", "col 2", "col 3")
VALUES
  ('67458', 'ADM', '1008'),
  ('67458', 'ADM', '1009'),
  ('67458', 'SKI', '1009'),
  ('67458', 'LIS', '1010'),
  ('67458', 'TOU', '1121');

没有要显示的结果。


查询#2

SELECT MAX("col 3") AS "col 4" INTO col4 FROM test t2 WHERE t2."col 2" = 'ADM';

输出

SELECT "col 1",
       "col 2",
       "col 3",
       "col 4"
FROM test
CROSS JOIN
col4;

View on DB Fiddle

答案 3 :(得分:0)

SELECT t.*, max(CASE WHEN col2 = 'ADM' THEN col3 END) OVER (PARTITION BY col1) AS col4
FROM   tbl t;

聚合FILTER子句是PostgreSQL 9.4中引入的,对此非常有用。但是Redshift不是Postgres,并且在Postgres中大多数后来的添加都不受支持。比较: