Получить максимальное значение из окна строк как новый столбец для всех строк - PullRequest
1 голос
/ 29 марта 2019
| 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  |

Я знаю, как это сделать с помощью подвыборов и всего. col4 будет псевдостолбцом, который будет использоваться ниже для JOIN и прочего.

Я пробовал следующее, но оно заполняется 1121 вместо 1009 :

MAX(col3) OVER (PARTITION BY col1 (CASE WHEN col2='ADM' THEN col2 END) ORDER BY col1)

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Используйте функции окна:

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;
1 голос
/ 29 марта 2019

Вы можете использовать коррелированный подзапрос:

select t.*,
       (select max(t1.col3) from table t1 where t1.col1 = t.col1 and t1.col2 = 'ADM') as col4
from table t;
0 голосов
/ 29 марта 2019
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 там не поддерживаются.Сравните:

0 голосов
/ 29 марта 2019

Вы можете использовать подзапрос в SELECT, чтобы получить это значение.

Этот suq-запрос может быть сохранен в переменной, если вы не возражаете выполнить его снова и снова и перекрестно соединить его.

Схема (PostgreSQL v10.0)

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');

Запрос № 1

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

Нет результатов для отображения.


Запрос № 2

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

выход

| 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  |

Просмотр на БД Fiddle

...