Row_number()
是排名窗函數,將分配一個號碼時將復位開始1
在partition by
每個給定組的列,並且在各列中的order by
的順序。
如果我們partition by ItemId
和order by Date desc
然後用最新Date
每個ItemId
該行給出的1
的row_number()
。
由此,我們可以使用子查詢common table expression或top with ties
過濾連接和聚合的結果。
使用top with ties
和row_number()
:
select top 1 with ties
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
, Qty = sum(tn.Qty)
from TableNumber tn
inner join TableDetails td
on tn.TableDetailsId = td.Id
group by
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
order by row_number() over (partition by tn.ItemId order by td.Date desc);
或row_number()
;with cte as (
select
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
, Qty = sum(tn.Qty)
, rn = row_number() over (partition by tn.ItemId order by td.Date desc)
from TableNumber tn
inner join TableDetails td
on tn.TableDetailsId = td.Id
group by
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
)
select ItemId, Placed, TableDetailsNumber, Date, Qty
from cte
where rn = 1;
一個common table expression另一種選擇使用cross apply()
:
select
i.ItemId
, x.Placed
, x.TableDetailsNumber
, x.Date
, x.Qty
from (select distinct ItemId from TableNumber) i
cross apply (
select top 1
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
, Qty = sum(tn.Qty)
from TableNumber tn
inner join TableDetails td
on tn.TableDetailsId = td.Id
where tn.ItemId = i.Itemid
group by
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, td.Date
order by td.Date desc
) x
rextester演示:http://rextester.com/QNV39265
每次返回:
+--------+--------+--------------------+------------+-----+
| ItemId | Placed | TableDetailsNumber | Date | Qty |
+--------+--------+--------------------+------------+-----+
| 111 | Dubai | 556 | 2017-07-31 | 50 |
| 112 | London | 555 | 2017-05-31 | 10 |
| 123 | Dubai | 556 | 2017-07-31 | 2 |
+--------+--------+--------------------+------------+-----+
哪一個將是明智的表現最好的一個? –
@mohamedfaiz它取決於服務器以及您正在處理的行數。 – SqlZim
感謝兄弟。它真的幫助我很多瞭解 –