【问题标题】:SQL Server : how to select just the top row of each group in a query that already has a join?SQL Server:如何在已经有连接的查询中只选择每个组的第一行?
【发布时间】:2017-03-19 06:32:54
【问题描述】:

我正在尝试为 SQL 查询中的每个组只选择第一行:

SELECT DISTINCT 
    CASE 
       WHEN S.ResEndDate = @StartDate 
          THEN 'ASAP' 
          ELSE '' 
    END AS 'ASAP', 
    R.RENTALNUMBER, 
    R.Area, 
    R.PadNum, 
    R.Size, 
    R.Pet, 
    R.Cost
FROM 
    RMS_Rentals R
INNER JOIN 
    RMS_Reservations S ON R.RentalNumber = S.RentalID
WHERE 
    Size = @RentalType  
    AND (RentalNumber NOT IN ((SELECT RentalID 
                               FROM RMS_Reservations  
                               WHERE NOT ((ResStartDate > @EndDate OR  ResEndDate <= @StartDate)))))  
GROUP BY 
    RENTALNUMBER, AREA, PadNum, Size, Pet, Cost, ResStartDate, ResEndDate
ORDER BY 
    RENTALNUMBER, 1 DESC

该查询用于检查并查看在给定特定类型、预订开始日期和结束日期的情况下是否可以租用特定租赁。如果给定的开始日期与不同预订的结束日期相同,它还必须尽快显示。

现在的查询方式,它为所有 ASAP 的租金显示了两行(其中一行不是 ASAP,另一行是它),并且仅一行显示不是 ASAP 的租金。

我希望它只为每个租赁显示 1 行,以及该租赁是否尽快。

我使用的是 SQL Server 2008R2

示例结果集:

ASAP    RENTALNUMBER    Area      PadNum       Size   Pet

ASAP    CB0001          Cabin Row   1         Cabin    No 
        CB0001          Cabin Row   1         Cabin    No 
ASAP    CB0003          Cabin Row   3         Cabin    No 
        CB0003          Cabin Row   3         Cabin    No 
ASAP    CB0005          Cabin Row   5         Cabin    No 
        CB0005          Cabin Row   5         Cabin    No 
        CB0006          Cabin Row   6         Cabin    No 
ASAP    CB0007          Cabin Row   7         Cabin    No 
        CB0007          Cabin Row   7         Cabin    No 
        CB0008          Cabin Row   8         Cabin    No 
ASAP    CB0009          Cabin Row   9         Cabin    No 
        CB0009          Cabin Row   9         Cabin    No 
        CB0010          Cabin Row   10        Cabin    No 
ASAP    CB0012          Cabin Row   12        Cabin    No 
        CB0012          Cabin Row   12        Cabin    No 
        CB0052          Melody Lane 52        Cabin    NO 
ASAP    CB0053          Melody Lane 53        Cabin    No 
        CB0053          Melody Lane 53        Cabin    No 
ASAP    CB0054          Melody Lane 54        Cabin    No 
        CB0054          Melody Lane 54        Cabin    No 
        CB0055          Melody Lane 55        Cabin    No 
        RV0052          Shady Lane  NULL      Cabin    No 

我希望它返回的只是每个唯一的 RentalNumber 的一行,显示该 Rental 是否是 ASAP:

ASAP    RENTALNUMBER    Area      PadNum       Size   Pet

ASAP    CB0001          Cabin Row   1         Cabin    No 
ASAP    CB0003          Cabin Row   3         Cabin    No 
ASAP    CB0005          Cabin Row   5         Cabin    No 
        CB0006          Cabin Row   6         Cabin    No 
ASAP    CB0007          Cabin Row   7         Cabin    No 
        CB0008          Cabin Row   8         Cabin    No 
ASAP    CB0009          Cabin Row   9         Cabin    No 
        CB0010          Cabin Row   10        Cabin    No 
ASAP    CB0012          Cabin Row   12        Cabin    No 
        CB0052          Melody Lane 52        Cabin    NO 
ASAP    CB0053          Melody Lane 53        Cabin    No 
ASAP    CB0054          Melody Lane 54        Cabin    No 
        CB0055          Melody Lane 55        Cabin    No 
        RV0052          Shady Lane  NULL      Cabin    No 

【问题讨论】:

  • 我不遵循你的逻辑。样本数据和期望的结果会有所帮助。
  • 哪些列定义了 RMS_Rentals 表的主键?
  • @JohnH,PK 是 RentalNumber

标签: sql sql-server join group-by


【解决方案1】:

根据您的示例数据,您可以:

SELECT MAX(ASAP) as ASAP, RENTALNUMBER, Area, PadNum, Size, Pet
FROM t
GROUP BY RENTALNUMBER, Area, PadNum, Size, Pet;

【讨论】:

  • 没关系。我想到了。这确实奏效了。非常感谢!
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 2012-01-02
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2019-06-19
  • 2013-05-07
相关资源
最近更新 更多