mysql group by每个组返回多行

svmlkihl  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(410)

给出一个示例表:

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

如果你能帮我实现我想要的结果,我会非常感激的。提前谢谢。

wljmcqd8

wljmcqd81#

有什么方法可以让我得到每组最新的n行吗?
在row\ u 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
mhd8tkvw

mhd8tkvw2#

如果您升级到mysql 8.0,那么这将解决此问题:

SELECT * FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY locationID ORDER BY Date_Time DESC) AS r
  FROM HealthStatus
) T
WHERE r <= 3;

在5.7。。。我想不出一个办法(

相关问题