[MySQL] Как сортировать к тому времени по группам? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть таблица и данные, подобные этой:

    id hour name
    1  0    a1
    1  1    a2
    1  2    a3
    1  3    a4
    2  1    a5
    2  1    a6 
    2  2    a7
    2  3    a8
    3  1    a9
    3  0    a10
    4  1    a11
    4  1    a12
    5  1    a13
    ……

Я хочу найти несколько идентификаторов, таких как (1,2,4 ....), а также максимум (час) идентификаторов и уникальный идентификатор

результат типа:

id  hour  name
1   3     a4
2   3     a8
3   1     a9
4   1     a12
....

Я пытаюсь группировать и сортировать, но не получается.Как это написать?Спасибо.

В первый раз, когда я пишу вопрос, теряю некоторую информацию, поэтому, возможно, какой-то ответ мне не нужен.Поэтому я обновляю вопрос.Извините, я сначала использую stackowverflow, извините за мою ошибку.

это мой неправильный sql: select * from tb, где id в (1,2,3,4) группируются по порядку идентификаторов по часам.

Я знаю, как написать правильный метод:

это неправильно:

выберите идентификатор, макс (час) из группы tb по tb;

это правильно:

SELECT a.id, a.maxhour, b.name FROM (SELECT id, max (hour) AS maxhour, имя FROM tb, где id в (1,2), 3,4) GROUP BY id) ПРИСОЕДИНЕНИЕ tb b ON a.id = b.id И a.maxhour = b.hour

спасибо всем моим друзьям.Ваш ответ заставляет меня знать, как это сделать

Ответы [ 3 ]

0 голосов
/ 01 марта 2019
SELECT id,max(hour) as hour FROM table_name group by id order by id,hour desc;

Попробуйте этот запрос.

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

Похоже, вы просто хотите взять максимальное значение часа для каждой группы id.Вот один из способов сделать это с помощью аналитических функций, при условии, что вы используете MySQL 8+ или более поздней версии:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY hour DESC) rn
    FROM yourTable
)

SELECT id, hour
FROM cte
WHERE rn = 1
ORDER BY hour DESC;

enter image description here

Демо

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

Вам нужно использовать агрегатные функции max() и group by:

SELECT id, MAX(hour) AS mhour FROM tablename
GROUP BY id
ORDER BY mhour DESC

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

    SELECT id, hour, name FROM tablename a
        WHERE CAST(LTRIM(REPLACE(name,'a','')) AS int) IN (SELECT MAX(CAST(LTRIM(REPLACE(name,'a','')) AS int)) FROM tablename b WHERE a.id=b.id)
    ORDER BY hour DESC
...