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
感谢兄弟。它真的帮助我很多了解 –