Выбор столбца, где другой столбец максимален - PullRequest
1 голос
/ 05 ноября 2019

Я думаю, это стандартная проблема. Но я не смог найти правильного решения.

У меня есть три столбца в таблице A:

ID     ID_Version     Var
1        1            A
1        2            A
1        3            X
1        4            D
2        1            B
2        2            Z
2        3            D
3        1            A
4        1            B
4        2            Q
4        3            Z

Для каждого уникального идентификатора я хотел бы выделить значение Var, принадлежащеемаксимальная ID-версия.

Для ID = 1 это будет D, для ID = 2 это будет D, для ID = 3 это будет A, а для ID = 4 это будет Z.

Я пытался использовать оператор group by, но не могу выбрать значения Var при использовании функции max в ID-версии и группировании по ID.

Кто-нибудь знает, как писать быстро,эффективный код для этой простой задачи?

Ответы [ 4 ]

2 голосов
/ 05 ноября 2019

использование row_number() аналитическая функция:

select ID,Var from
(
select row_number() over (partition by id order by id_version desc) as rn,
       t.*
  from tab t
)
where rn = 1

или max(var) keep (dense_rank...)

select id, max(var) keep (dense_rank first order by id_version desc) as var
  from tab 
 group by id

Демо

1 голос
/ 05 ноября 2019

Вы можете использовать функцию ранжирования:

SELECT *
FROM (SELECT tab.*, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID_Version DESC) rn
      FROM tab)
WHERE rn = 1
0 голосов
/ 05 ноября 2019

Вы также можете использовать простое объединение, чтобы делать то, что вы хотите, см. Ниже:

SELECT A.id, A.var FROM A
JOIN
(SELECT id, MAX(id_version) as id_version
FROM A
GROUP BY id) temp ON (temp.id = A.id AND temp.id_version = A.id_version)

Или вы также можете использовать подзапрос, подобный этому:

SELECT a1.id, a1.var FROM A a1
WHERE a1.id_version = (SELECT MAX(id_version) FROM A a2 WHERE a2.id = a1.id)
0 голосов
/ 05 ноября 2019

Oracle имеет синтаксис keep, поэтому вы также можете использовать агрегирование:

select id, max(id_version) as id_version,
       max(var) keep (dense_rank first order by id_version desc) as var
from a
group by id;
...