需要唯一具有最大BookingVersion 分组依据的行 shipmentNumber, shipmentDate,
elect max(BookingVersion) BookingVersion, flightId, shipmentNumber, shipmentDate, FlightOffPoint, IIF(BookingStatusCode = 'XX', 'XX','SS') BookingStatusCode
from Exp_BookingDelta where flightid='625436'
group by flightId, shipmentNumber, shipmentDate, FlightOffPoint, BookingStatusCode
order by max(BookingVersion) desc
谁能解释我所缺少的吗?
当前结果:
BookingVersion flightId shipmentNumber shipmentDate FlightOffPoint BookingStatusCode
4 625436 61823647238 2019-12-04 LHR XX
2 625436 61823647238 2019-12-04 LHR SS
1 625436 61826374895 2019-12-06 LHR XX
0 625436 61825364780 2019-11-26 LHR SS
0 625436 61825364791 2019-11-26 LHR SS
0 625436 61825364802 2019-11-26 LHR SS
0 625436 61826374895 2019-12-06 LHR SS
预期结果:
BookingVersion flightId shipmentNumber shipmentDate FlightOffPoint BookingStatusCode
4 625436 61823647238 2019-12-04 LHR XX
1 625436 61826374895 2019-12-06 LHR XX
0 625436 61825364780 2019-11-26 LHR SS
0 625436 61825364791 2019-11-26 LHR SS
0 625436 61825364802 2019-11-26 LHR SS
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你的SQL查询试图找出每个分组(基于flightId
, shipmentNumber
, shipmentDate
, FlightOffPoint
, 和 BookingStatusCode
)中具有最大BookingVersion
的行。然而,你目前的结果显示了所有版本,而不仅仅是每个分组的最大版本。
问题在于你的GROUP BY
子句包含了BookingStatusCode
,这导致了每个唯一的BookingStatusCode
值都有自己的分组,即使它们在其他列上的值相同。因此,你得到了多个具有不同BookingStatusCode
但相同最大BookingVersion
的行。
要达到预期结果,你需要首先找到每个分组的最大BookingVersion
,然后根据这个版本选取对应的行。这可以通过子查询或者窗口函数实现。这里提供一个使用窗口函数ROW_NUMBER()
的方法:
WITH RankedBookings AS (
SELECT
BookingVersion,
flightId,
shipmentNumber,
shipmentDate,
FlightOffPoint,
BookingStatusCode,
ROW_NUMBER() OVER(PARTITION BY flightId, shipmentNumber, shipmentDate, FlightOffPoint
ORDER BY BookingVersion DESC) as rn
FROM
Exp_BookingDelta
WHERE
flightid='625436'
)
SELECT
BookingVersion, flightId, shipmentNumber, shipmentDate, FlightOffPoint, BookingStatusCode
FROM
RankedBookings
WHERE
rn = 1
ORDER BY
BookingVersion DESC;
这段代码首先创建了一个名为RankedBookings
的临时结果集,其中包含了一个额外的列rn
,该列通过ROW_NUMBER()
窗口函数为每个分组(基于flightId
, shipmentNumber
, shipmentDate
, FlightOffPoint
)内的行按BookingVersion
降序分配了一个唯一的行号。然后,外部查询从这个临时结果集中选择了每个分组的第一行(即rn = 1
),这些行对应于每个分组的最大BookingVersion
。这样就能得到你期望的结果。