return 满足 sql 中条件的最后一行

return the last row that meets a condition in sql

我有两个表:

仪表

ID         SerialNumber
=======================
1          ABC1
2          ABC2
3          ABC3
4          ABC4
5          ABC5
6          ABC6

注册级别信息

ID         MeterID    ReadValue    Consumption  PreviousReadDate    ReadType
============================================================================
1          1          250          250          1 jan 2015          EST
2          1          550          300          1 feb 2015          ACT
3          1          1000         450          1 apr 2015          EST
4          2          350          350          1 jan 2015          EST
5          2          850          500          1 feb 2015          ACT
6          2          1000         150          1 apr 2015          ACT
7          3          1500         1500         1 jan 2015          EST
8          3          2500         1000         1 mar 2015          EST
9          3          5000         2500         4 apr 2015          EST
10         4          250          250          1 jan 2015          EST
11         4          550          300          1 feb 2015          ACT
12         4          1000         450          1 apr 2015          EST
13         5          350          350          1 jan 2015          ACT
14         5          850          500          1 feb 2015          ACT
15         5          1000         150          1 apr 2015          ACT
16         6          1500         1500         1 jan 2015          EST
17         6          2500         1000         1 mar 2015          EST
18         6          5000         2500         4 apr 2015          EST

我正在尝试按仪表序列号和 return 每个仪表的最后实际读取日期进行分组,但我不确定如何完成此操作。这是我到目前为止的sql:

select a.SerialNumber, ReadTypeCode, MAX(PreviousReadDate) from Meter as a
left join RegisterLevelInformation as b on a.MeterID = b.MeterID
where ReadType = 'ACT'
group by a.SerialNumber,b.ReadTypeCode, PreviousReadDate
order by a.SerialNumber

我似乎无法让 MAX 功能在 return 中生效,只有最新的实际读数行和它 return 所有日期和相同的仪表序列多次显示。

如果我使用以下 sql:

select a.SerialNumber, count(*) from Meter as a
left join RegisterLevelInformation as b on a.MeterID = b.MeterID
group by a.SerialNumber
order by a.SerialNumber

那么每个连续剧只显示一次。任何帮助将不胜感激。

正如@PaulGriffin 在他的评论中所说,您需要从 GROUP BY 子句中删除 PreviousReadDate 列。

您为什么遇到这种行为?

基本上您选择的分区 - (SerialNumber,ReadTypeCode,PreviousReadDate) 对于这些值中的每一对不同的值打印您 SerialNumber, ReadTypeCode, MAX(PreviousReadDate)。由于您将 MAX() 函数应用于包含此列的分区的每一行,您只是在一个值上使用聚合函数 - 因此 MAX() 的输出将等于没有它的输出。

你想要达到的目标

每对 (SerialNumber,ReadTypeCode) 得到 PreviousReadDateMAX 值。所以这就是您的 GROUP BY 子句应该包含的内容。

select a.SerialNumber, ReadTypeCode, MAX(PreviousReadDate) from Meter as a
left join RegisterLevelInformation as b on a.MeterID = b.MeterID
where ReadType = 'ACT'
group by a.SerialNumber,b.ReadTypeCode
order by a.SerialNumber

是你想要的正确SQL查询。

差异示例

ID         MeterID    ReadValue    Consumption  PreviousReadDate    ReadType
============================================================================
1          1          250          250          1 jan 2015          EST
2          1          550          300          1 feb 2015          ACT
3          1          1000         450          1 apr 2015          EST

在这里,如果您应用按 3 列分组的查询,您将得到结果:

SerialNumber | ReadTypeCode | PreviousReadDate
  ABC1       |    EST       | 1 jan 2015 -- which is MAX of 1 value (1 jan 2015)
  ABC1       |    ACT       | 1 feb 2015
  ABC1       |    EST       | 1 apr 2015

但是当你只按 SerialNumber,ReadTypeCode 分组时它会产生结果(考虑我发布的示例数据):

SerialNumber | ReadTypeCode | PreviousReadDate
  ABC1       |    EST       | 1 apr 2015 -- which is MAX of 2 values (1 jan 2015, 1 apr 2015)
  ABC1       |    ACT       | 1 feb 2015 -- which is MAX of 1 value (because ReadTypeCode is different from the row above

第二个查询的解释

在这个查询中 - 你确实是对的 - 每个序列只显示一次。

select a.SerialNumber, count(*) from Meter as a
left join RegisterLevelInformation as b on a.MeterID = b.MeterID
group by a.SerialNumber
order by a.SerialNumber

但是如果您按更多列添加分组(您在第一个查询中已完成 - 自己尝试),此查询会产生您意想不到的奇怪结果。

您需要从 Group By 子句中删除 PreviousReadDate。 您的查询应如下所示:

select a.SerialNumber, ReadTypeCode, MAX(PreviousReadDate) from Meter as a
left join RegisterLevelInformation as b on a.MeterID = b.MeterID
where ReadType = 'ACT'
group by a.SerialNumber,b.ReadTypeCode
order by a.SerialNumber

要了解当您提到多列时 group by 子句的工作原理,请遵循此 link:Using group by on multiple columns

您将了解您的查询有什么问题,以及为什么 returns 多次显示所有日期和相同的仪表序列号。 祝你好运! 荣誉! :)