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)
得到 PreviousReadDate
的 MAX
值。所以这就是您的 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 多次显示所有日期和相同的仪表序列号。
祝你好运!
荣誉! :)
我有两个表:
仪表
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)
得到 PreviousReadDate
的 MAX
值。所以这就是您的 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 多次显示所有日期和相同的仪表序列号。 祝你好运! 荣誉! :)