MySQL GROUP BY 每组返回多行

标签 mysql group-by

给定一个示例表:

| id | locationID |      Date_Time      | temp |
|----|------------|---------------------|------|
| 1  | L001       | 2018-09-04 11:25:00 | 52.6 |
| 2  | L002       | 2018-09-04 11:35:00 | 66.1 |
| 3  | L003       | 2018-09-04 03:30:00 | 41.2 |
| 4  | L003       | 2018-09-05 10:22:00 | 71.8 |
| 5  | L003       | 2018-09-06 14:21:00 | 63.4 |
| 6  | L003       | 2018-09-06 18:18:00 | 50.1 |

我想返回每个组的最新 N 条记录,如下所示:

预期输出:

| id | locationID |      Date_Time      | temp |
|----|------------|---------------------|------|
| 1  | L001       | 2018-09-04 11:25:00 | 52.6 |
| 2  | L002       | 2018-09-04 11:35:00 | 66.1 |
| 4  | L003       | 2018-09-05 10:22:00 | 71.8 |
| 5  | L003       | 2018-09-06 14:21:00 | 63.4 |
| 6  | L003       | 2018-09-06 18:18:00 | 50.1 |

我有这个查询,但它只返回每个组的最新行?我想为每个组返回不止一行(N 行)?

SELECT *
FROM HealthStatus
WHERE Date_Time IN (
    SELECT MAX(Date_Time)
    FROM HealthStatus
    GROUP BY LocationID
)

非常感谢您提供有关如何实现所需输出的帮助。提前致谢。

最佳答案

有什么方法可以获取每个组的最新 N 行?

在 row_number() 可用之前,您可以使用变量来模拟该函数

SELECT
*
FROM (
    SELECT
          @row_num :=IF(@prev_value=locationID,@row_num+1,1)AS RowNumber
        , id , locationID , Date_Time,temp
        , @prev_value := locationID
    FROM HealthStatus
    CROSS JOIN (SELECT @row_num :=1,  @prev_value :='') vars
    ORDER BY
          locationID , Date_Time DESC
    ) derived
WHERE RowNumber < 4

关于MySQL GROUP BY 每组返回多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52217585/

相关文章:

C# Groupby 然后在拆分 CSV 后求和(无标题)

python - 来自 groupby 的 Pandas 累积差异

sql-server - 如何在选择查询中不选择第三行

php - Highstock mysql json 多条数据

c# - 通过 C# 将图像添加到 blob (mysql)

java - 如何通过查询选择对象列表作为 Hibernate 组的构造函数参数的一部分

mysql - 如何添加一个字段来计算查询检索到的记录数?为什么我会收到此错误消息?

mysql - 在同一台机器上运行多个 mysql 服务

sql输出作为排名

php - 迁移不要把 "unique"放在我的 table 上