[MySQL]如何排序然后分组?

时间:2019-03-01 04:46:23

标签: mysql group-by greatest-n-per-group

我有这样的表和数据:

    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,以及ID的max(hour)和唯一ID

结果如:

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

我尝试分组并排序,但是失败。 怎么写呢? 谢谢。

第一次,当我写问题时,丢失了一些信息,所以也许某些答案不是我想要的。所以我更新了问题。 抱歉,我首先使用stackowverflow,对不起,我很抱歉。

这是我的错误sql: 从tb中选择*,其中(1,2,3,4)中的id按小时顺序按id顺序分组。

我知道如何编写正确的方法:

这是错误的:

从tb组中按tb选择id,max(hour);

这是正确的:

选择a.id,a.maxhour,b.name 来自(        SELECT id,max(hour)AS maxhour,名称        从tb        在(1,2,3,4)中的id        按ID分组)        在a.id = b.id和a.maxhour = b.hour上加入tb b

谢谢我所有的朋友。 您的回答使我知道该怎么做

3 个答案:

答案 0 :(得分:3)

您需要使用聚合函数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

答案 1 :(得分:0)

SELECT id,max(hour) as hour FROM table_name group by id order by id,hour desc;

尝试此查询。

答案 2 :(得分:0)

这看起来就像您只想获取每个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

Demo