开发者社区 问答 正文

无法在SQL Server中执行分组依据

需要唯一具有最大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

展开
收起
心有灵_夕 2019-12-06 23:05:29 653 分享 版权
阿里云 AI 助理回答

你的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。这样就能得到你期望的结果。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答