如何获得带有最大日期的行? [重复]

问题描述 投票:0回答:2

我有一张桌子,如:

|serialnumber|     location     |    medium |address|    date      | value
| 320921     | Pomieszczenie C  | Gaz       |  9    | 2019-12-14   | 547
| 320921     | Pomieszczenie C  | Gaz       |  9    | 2019-12-16   | 626
| 374836     | Pomieszczenie B  | Wodomierz |  5    | 2019-12-28   | 1728
| 374836     | Pomieszczenie B  | Wodomierz |  5    | 2020-01-01   | 1998

我想获得最大日期的行,基于由serialNumber分组的结果,如下所示:

|serialnumber|     location     |    medium |address|    date      | value
| 320921     | Pomieszczenie C  | Gaz       |  9    | 2019-12-16   | 626
| 374836     | Pomieszczenie B  | Wodomierz |  5    | 2020-01-01   | 1998

您能否分享您的想法?

mysql sql greatest-n-per-group
2个回答
0
投票

从样本数据看来,您想要具有serialnumberlocation每种组合的最新日期的行。您可以使用NOT EXISTS

完成
select t.* from tablename t
where not exists (
  select 1 from tablename
  where serialnumber = t.serialnumber and location = t.location and date > t.date
)

请参见demo。结果:

| serialnumber | location        | medium    | address | date                | value |
| ------------ | --------------- | --------- | ------- | ------------------- | ----- |
| 320921       | Pomieszczenie C | Gaz       | 9       | 2019-12-16 00:00:00 | 626   |
| 374836       | Pomieszczenie B | Wodomierz | 5       | 2020-01-01 00:00:00 | 1998  |

0
投票

我将使用相关子查询进行过滤(以及(serialnumber, date)上的索引以提高性能):

select t.*
from mytable t
where t.date = (
    select max(t1.date)
    from mytable t1
    where t1.serial_number = t.serial_number
)

根据数据集的大小和分布,您可能需要考虑使用汇总查询进行联接:

select t.*
from mytable t
inner join (
    select serial_number, max(date) max_date
    from mytable
    group by serial_number
) t1
    on  t1.serial_number = t.serial_number
    and t1.max_date = t.date


© www.soinside.com 2019 - 2024. All rights reserved.