【问题标题】:Not able to perform Group-by in SQL Server无法在 SQL Server 中执行 Group-by
【发布时间】:2019-12-06 04:58:46
【问题描述】:

试图过滤细节

需要最大BookingVersion group by shipmentNumber, shipmentDate, 的唯一行

select 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

【问题讨论】:

  • 问题是什么?请添加您的查询和您得到的错误。
  • 请提出您的问题,到目前为止您已经尝试过什么
  • @juergend 添加了查询。
  • @MukeshArora 已添加。
  • 您能否解释一下您的逻辑是如何返回“预期”行?

标签: sql sql-server join group-by sql-order-by


【解决方案1】:

请尝试:

select 
   max(BookingVersion) BookingVersion, flightId, shipmentNumber, shipmentDate, FlightOffPoint, MAX(BookingStatusCode) BookingStatusCode
from
   Exp_BookingDelta where flightid='625436' 
group by flightId, shipmentNumber, shipmentDate, FlightOffPoint
order by max(BookingVersion) desc

select 
    max(BookingVersion) BookingVersion, flightId, shipmentNumber, shipmentDate,
    IIF((select count(*) from Exp_BookingDelta b where b.FlightId=a.FlightId and b.ShimpmentNumber=a.ShimpmentNumber)>0, 'XX', 'SS') BookingStatusCode
from 
    Exp_BookingDelta where flightid='625436' 
group by flightId, shipmentNumber, shipmentDate, FlightOffPoint  
order by max(BookingVersion) desc

【讨论】:

    【解决方案2】:

    我建议使用窗口函数来查找您想要的特定记录。喜欢:

    ;with c as (select BookingVersion, flightId, shipmentNumber, shipmentDate, FlightOffPoint, IIF(BookingStatusCode = 'XX', 'XX','SS') BookingStatusCode
                     , row_number() over (partition by shipmentNumber order by BookingVersion desc) rn
                  from Exp_BookingDelta
                 where flightid='625436')
    select BookingVersion, flightId, shipmentNumber, shipmentDate, FlightOffPoint, BookingStatusCode
      from c
     where rn = 1
    

    【讨论】:

      【解决方案3】:

      请根据我准备的预期输出检查此查询。

      注意:请根据您的实际查询更改此查询。

      查询

      DECLARE @Table TABLE
      (
          BookingVersion INT,
          flightId INT,
          shipmentNumber VARCHAR(20),
          shipmentDate DATE,
          FlightOffPoint VARCHAR(10),
          BookingStatusCode VARCHAR(10)
      )
      
      INSERT INTO @Table 
      VALUES(
      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')
      
      
      SELECT MAX(BookingVersion) AS BookingVersion,
          flightId,
          shipmentNumber,
          shipmentDate,
          FlightOffPoint, 
          MAX(BookingStatusCode) AS BookingStatusCode
      FROM @Table 
      GROUP BY flightId, shipmentNumber, shipmentDate, FlightOffPoint
      ORDER BY MAX(BookingVersion) DESC
      

      输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        相关资源
        最近更新 更多