我有一张桌子,如:
|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
您能否分享您的想法?
从样本数据看来,您想要具有serialnumber
和location
每种组合的最新日期的行。您可以使用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 |
我将使用相关子查询进行过滤(以及(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