SQL语句选择唯一

时间:2019-07-19 03:42:34

标签: sql sql-server

我在名为Lockers的表中有以下数据(还有其他列,但现在请忽略它们)。

---------------------------------------
| ID    | LockerNo    | BookingID      |
----------------------------------------
| 1     | A01         | 111111         |
| 1     | A01         | 222222         |
| 1     | A01         | 333333         |
| 2     | A02         | 888888         |
| 2     | A02         | 999999         |
| 3     | A03         | 121212         |
| 3     | A03         | 232323         |
| 4     | A04         | 777777         |
| 5     | A05         | 555555         |
| 6     | A06         | 444444         |
----------------------------------------

上面的输出是通过以下SQL生成的:

Select LockerID, LockerNo, LBD.BookingID 
From Lockers L 
Inner Join LockerBookingDetails LBD On LBD.LockerID = L.ID  
Where Zone = 1 And IsActive = 1 
Order By L.LockerNo, LBD.BookingID 

我一直在努力创建一条SQL语句来显示以下输出。条件是获取最新数据(假设BookingID升序排列)。

---------------------------------------
| ID    | LockerNo    | BookingID      |
----------------------------------------
| 1     | A01         | 333333         |
| 2     | A02         | 999999         |
| 3     | A03         | 232323         |
| 4     | A04         | 777777         |
| 5     | A05         | 555555         |
| 6     | A06         | 444444         |
----------------------------------------

3 个答案:

答案 0 :(得分:2)

一种选择是使用窗口函数,这将为您提供每个LockerNO的最大BookingId:

SELECT
    Id, 
    LockerNo,
    BookingId
FROM
(
    SELECT
        ROWID = ROW_NUMBER() OVER(PARTITION BY LockerNO ORDER BY lbd.BookingId DESC),
        l.Id,
        l.LockerNo,
        lbd.BookingId
    FROM
        Lockers l 
        inner join LockerBookingDetails lbd on lbd.LockerID = l.ID  
    Where 
        Zone = 1 
        And IsActive = 1
) r
WHERE
    r.ROWID = 1

了解OVER子句和排名函数将对您有所帮助,请参阅SQL Server文档:

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

答案 1 :(得分:2)

SELECT LockerID, LockerNo, MAX(BookingID) BookingID 
FROM 
(
   SELECT LockerID, LockerNo, LBD.BookingID 
   FROM   Lockers L INNER JOIN LockerBookingDetails LBD ON LBD.LockerID = L.ID  
   WHERE  Zone     = 1 
   AND    IsActive = 1 
) A 
GROUP BY LockerID, LockerNo
ORDER BY LockerID, LockerNo

答案 2 :(得分:1)

只需将聚合添加到您的查询中即可:

Select L.LockerID, L.LockerNo, MAX(LBD.BookingID) as BookingID
From Lockers L Inner Join
     LockerBookingDetails LBD
     On LBD.LockerID = L.ID  
Where Zone = 1 And IsActive = 1 
Group by L.LockerID, L.LockerNo
Order By L.LockerNo, MAX(LBD.BookingID);

不需要子查询。