SQL как найти максимум нескольких столбцов в группе? - PullRequest
1 голос
/ 28 мая 2020

Как я могу написать запрос SQL (DB2), который будет запускаться в этой таблице:

| A | B | C | V  |
+---+---+---+----+
|   |   |   |    |
| 1 | 1 | 1 | k1 |
|   |   |   |    |
| 1 | 1 | 2 | k1 |
|   |   |   |    |
| 1 | 2 | 3 | k2 |
|   |   |   |    |
| 2 | 3 | 4 | k2 |
|   |   |   |    |
| 1 | 2 | 3 | k3 |
|   |   |   |    |
| 1 | 3 | 5 | k3 |
|   |   |   |    |
| 1 | 4 | 6 | k3 |
+---+---+---+----+

и получить такой результат

+---+---+---+----+
| A | B | C | V  |
+---+---+---+----+
|   |   |   |    |
| 1 | 1 | 2 | k1 |
|   |   |   |    |
| 2 | 3 | 4 | k2 |
|   |   |   |    |
| 1 | 4 | 6 | k3 |
+---+---+---+----+

то есть он будет выбирать строки на основе максимального количества «кортежа» (A, B, C) в группе:

или для двух строк R1, R2:

if R1.A <> R2.A  return  Row where A = Max(R1.A,R2.A)
if R2.B <> R2.B  return  Row where B = Max(R1.B,R2.B)
return  Row where C = Max(R1.C,R2.C)

1 Ответ

3 голосов
/ 28 мая 2020

Я думаю, что row_number() делает то, что вы хотите - если под «группой» вы имеете в виду V:

select t.*
from (select t.*,
             row_number() over (partition by v order by a desc, b desc, c desc) as seqnum
      from t
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...