SQL查询需求:筛选最大时间戳为上周的仪表数据
完整SQL查询解决方案
我来帮你补全并优化这个查询,确保它能精准筛选出最新时间戳属于上周的仪表记录:
SELECT dbo.meter.DataImportCode, dbo.meter.NAME AS MeterName, -- 给重复的NAME字段加别名,避免歧义 dbo.company.NAME AS CompanyName, dbo.meter.MeterNumber, MAX(dbo.meterdata.RoundedTimeStamp) AS 'laatste datum', dbo.MeterOperator.Description, dbo.meter.CumulativeReadings FROM dbo.meter -- 补全仪表与数据记录表的关联(请根据实际表结构调整关联字段) LEFT OUTER JOIN dbo.MeterData ON dbo.meter.Id = dbo.MeterData.MeterId -- 补全仪表与公司表的关联 LEFT OUTER JOIN dbo.company ON dbo.meter.CompanyId = dbo.company.Id -- 补全仪表与运营商表的关联 LEFT OUTER JOIN dbo.MeterOperator ON dbo.meter.MeterOperatorId = dbo.MeterOperator.Id -- 按非聚合字段分组,确保每个仪表只返回一条最新记录 GROUP BY dbo.meter.DataImportCode, dbo.meter.NAME, dbo.company.NAME, dbo.meter.MeterNumber, dbo.MeterOperator.Description, dbo.meter.CumulativeReadings -- 筛选最新时间戳落在上周范围内的记录 HAVING -- 上周一开始(周一为一周起始,可根据需求调整) MAX(dbo.meterdata.RoundedTimeStamp) >= DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - 1, 0) -- 本周一开始(确保只包含上周的记录) AND MAX(dbo.meterdata.RoundedTimeStamp) < DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)
关键说明:
- 表关联调整:我假设了表之间的关联字段(比如
meter.Id和MeterData.MeterId),你需要根据实际数据库的表结构修改这些关联条件,否则查询会报错。 - 字段别名:给
dbo.meter.NAME和dbo.company.NAME加了别名,避免结果集中出现重复的列名导致混淆。 - 上周范围定义:这里的“上周”是指自然周的上周(从周一到周日)。如果你的需求是“过去7天”,可以把
HAVING子句替换成:HAVING MAX(dbo.meterdata.RoundedTimeStamp) >= DATEADD(DAY, -7, GETDATE()) AND MAX(dbo.meterdata.RoundedTimeStamp) <= GETDATE() - 聚合与分组:因为我们用了
MAX()聚合函数,所以所有非聚合的字段必须放到GROUP BY子句里,这样才能保证每个仪表只返回一条包含最新时间戳的记录。
注意事项:
- 确认
RoundedTimeStamp字段是datetime/datetime2类型,否则日期计算会出现异常。 - 如果你的数据库不是SQL Server(比如MySQL、Oracle),日期函数会有差异,需要对应调整日期计算逻辑。
内容的提问来源于stack exchange,提问作者mart de jong
相关产品推荐
相关产品推荐

