【问题标题】:[MySQL]How to sort by then group by?[MySQL]如何排序然后分组?
【发布时间】:2019-07-23 02:24:42
【问题描述】:

我有这样的表格和数据:

    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
    ……

我想找到一些 id,例如 (1,2,4 ....) 以及 id 的 max(hour) 和唯一 id

结果如下:

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

我尝试分组和排序,但失败了。 怎么写? 谢谢。

第一次,当我写问题时会丢失一些信息,所以也许某些答案不是我想要的。所以我更新了这个问题。 对不起,我第一次使用stackowverflow,对不起我的错误。

这是我的错误 sql: select * from tb where id in(1,2,3,4) group by id order by hour desc.

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

这是错误的:

select id, max(hour) from tb group by tb;

这是对的:

选择 a.id、a.maxhour、b.name 从 ( SELECT id, max(hour) AS maxhour, name 从结核病 其中 id 在 (1,2,3,4) GROUP BY id) 在 a.id = b.id 和 a.maxhour = b.hour 上加入 tb b

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

【问题讨论】:

  • 谢谢我所有的朋友。

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


【解决方案1】:

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

【讨论】:

  • 对不起,结果不是我想要的。我更新了我的问题,以便使问题更清楚。谢谢
  • @kingdelee,我已经更新了我的答案 - 我认为你需要第二个解决方案
  • 我看到了您的第二个解决方案。但它不包括按小时倒数排序,它不需要更改名称,我添加名称列是为了使排序结果显示清晰。
  • 顺便说一下,id ln (1,2,3)
  • 也许吧。我给你一些 id (1,2,3)。你的sql给我。 id:1,小时:3,名称:a4; id:2,小时:3,名称:a8; id:3,小时:1,名称:a9
【解决方案2】:

您似乎只想获取每个 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;

Demo

【讨论】:

  • 哇~~~看起来很酷。但是我的服务器使用mysql 5.7....所以可能我不能使用你的方法,有没有其他方法可以在mysql5.7中运行?
【解决方案3】:
SELECT id,max(hour) as hour FROM table_name group by id order by id,hour desc;

试试这个查询。

【讨论】:

  • 对不起,结果不是我想要的。我更新了我的问题,以便使问题更清楚。谢谢
  • 没关系,你是怎么取名字的?什么关系?
  • 也许吧。我给你一些 id (1,2,3)。你的sql给我。 id:1,小时:3,名称:a4; id:2,小时:3,名称:a8; id:3,小时:1,名称:a9
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多