Mysql несколько максимальных значений из таблицы - PullRequest
0 голосов
/ 23 мая 2019

у меня ниже структуры

+----+----+
| C1 | C2 |
+---------+
| 1  | A  |
| 2  | A  |
| 3  | A  |
| 4  | B  |
| 5  | B  |
| 6  | A  |
| 7  | C  |
+----+----+

Вывод должен быть

C1  C2    
3    A    
5    B    
6    A    
7    C

Он должен возвращать самое высокое значение C1 в каждой последовательности, имеющей то же значение C2

Простая группа не работает, пожалуйста, укажите, как этого добиться.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Похоже, вам нужны записи, в которых не существует более высокого c1 или c2 следующего более высокого c1 не равно текущему c2.Следующие c2 в порядке подзапроса можно получить по c1, используя LIMIT 1.

SELECT t1.c1,
       t1.c2
       FROM elbat t1
       WHERE NOT EXISTS (SELECT t2.c2
                                FROM elbat t2
                                WHERE t2.c1 > t1.c1)
              OR (SELECT t2.c2
                         FROM elbat t2
                         WHERE t2.c1 > t1.c1
                         ORDER BY t2.c1
                         LIMIT 1) <> t1.c2;

db <> fiddle

2 голосов
/ 23 мая 2019

Требуется максимальное значение c1 для каждой серии c2:

select t.* from tablename t
where 
  coalesce(
    (select c2 from tablename where c1 = (
      select min(c1) from tablename where c1 > t.c1)
    ), ''
  ) <> t.c2

См. Демоверсию .Результаты:

| C1  | C2  |
| --- | --- |
| 3   | A   |
| 5   | B   |
| 6   | A   |
| 7   | C   |
2 голосов
/ 23 мая 2019

Вы можете сделать это, LEFT JOIN присвоив себе таблицу для следующего значения в таблице, имеющего другое значение C2. Мы используем GROUP BY, чтобы получить последнюю строку в таблице, которая не соответствует:

SELECT MAX(d1.C1) AS C1, MAX(d1.C2) AS C2
FROM data d1
LEFT JOIN data d2 ON d2.C2 != d1.C2
                 AND d2.C1 = (SELECT MIN(C1) FROM data d3 WHERE d3.C1 > d1.C1)
GROUP BY d2.C1
ORDER BY C1

Выход:

C1  C2
3   A
5   B
6   A
7   C

Демонстрация по dbfiddle

...