我在名为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 |
----------------------------------------
答案 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文档:
答案 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);
不需要子查询。