Если две строки имеют одинаковые идентификаторы, но разные столбцы col2, как вы можете сохранить только те, которые имеют максимальный столбец col3? - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть таблица с тремя столбцами (id, col2, col3, col4), где col2 - это A или B, а col3 и col4 - целые числа. Моя проблема в том, что существует много столбцов с одинаковым идентификатором и другим значением col2, и я хочу выбрать ТОЛЬКО те строки, которые имеют максимальное значение в col3.

Например, если у нас есть:

id | col2 | col3 | col4
1  |  A   |  3   |  2
1  |  B   |  5   |  3
2  |  A   |  6   |  2
...

Я хочу оставить только кортеж (1, B, 5, 3). Как мне этого добиться?

Я пробовал это:

SELECT id, col2, MAX(col3), col4 FROM t GROUP BY id;

но я получаю сообщение о том, что это недопустимый оператор GROUP BY.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Этот запрос:

select t.* 
from tablename t inner join (
  select id, max(col3) col3
  from tablename
  group by id
  having count(distinct col2) > 1
) g on g.id = t.id and g.col3 = t.col3

возвращает для каждого id, который имеет разные значения в col2 только в 1 строке: тот, который содержит максимальное значение col3.Если вы также хотите, чтобы другие строки, в которых каждая id не имела разных значений в col2, используйте UNION ALL:

select t.* 
from tablename t inner join (
  select id, max(col3) col3
  from tablename
  group by id
  having count(distinct col2) > 1
) g on g.id = t.id and g.col3 = t.col3
union all
select t.* from tablename t
where not exists (
  select 1 from tablename
  where id = t.id and col2 <> t.col2
)
0 голосов
/ 20 апреля 2019

выберите * из TableName, где col3 = (выберите max (col3) из TableName)

0 голосов
/ 19 апреля 2019

Вы можете использовать keep:

SELECT id,
       MAX(col2) KEEP (DENSE_RANK FIRST ORDER BY col3 DESC) as col2
       MAX(col3),
       MAX(col4) KEEP (DENSE_RANK FIRST ORDER BY col3 DESC) as col4
FROM t
GROUP BY id;

Или:

SELECT id, col2, col3, col4
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY col3 DESC) as seqnum
      FROM t
     ) t
WHERE seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...