簡體   English   中英

SQL Server:如何只選擇已具有聯接的查詢中每個組的第一行?

[英]SQL Server : how to select just the top row of each group in a query that already has a join?

我試圖在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)。

我希望對每個租金只顯示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 

給定示例數據,您可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM