[英]How to get the row record of max(date) using SQL Server?
我有兩個表,分別為TableNumber and TableDetails
TableNumber
ItemID TableDetailsID Qty
----------------------------
111 12121 5
111 12121 20
112 12121 10
123 12121 5
111 22121 25
111 22121 25
123 22121 2
TableDetails
ID placed TableDetailsNumber Date
--------------------------------------------------
12121 London 555 2017-05-31
22121 Dubai 556 2017-07-31 <-- Max Date of Item 111
預期產量
ItemID Placed TableDetailsNumber Date Qty
----------------------------------------------------------
111 Dubai 556 2017-07-31 50 //(25 + 25) of 22121
112 London 555 2017-05-31 10
123 Dubai 556 2017-07-31 2
我試圖做MAX(Date),但是我不能使用分組來Placed,TableDetails
列
以及我不怎么用相同的TableDetailsNumber來求和ItemID的數量
請給我解釋你的答案,以了解 ,謝謝
Row_number()
是一個排序窗口函數,它將為partition by
中的每個給定列集partition by
分配一個數字,該數字從1
開始, order by
的order by
。
如果我們partition by ItemId
並按order by Date desc
則每個ItemId
具有最新Date
的行的row_number()
為1
。
這樣,我們可以使用子查詢, 公共表表達式或top with ties
過濾聯接和聚合的結果。
使用top with ties
和row_number()
top with ties
:
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);
;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;
使用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
extrester演示: 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 |
+--------+--------+--------------------+------------+-----+
這似乎將返回您想要的結果:
select n.itemid, d.placed, d.TableDetailsNumber, d.date, sum(n.qty)
from tablenumber n join
tabledetails d
on n.TableDetailsId = d.TableDetailsId
group by n.itemid, d.placed, d.TableDetailsNumber;
但這沒有得到最新日期。 為了那個原因:
select nd.*
from (select n.itemid, d.placed, d.TableDetailsNumber, d.date, sum(n.qty),
max(d.date) over (partition by n.itemid) as maxdate
from tablenumber n join
tabledetails d
on n.TableDetailsId = d.TableDetailsId
group by n.itemid, d.placed, d.TableDetailsNumber
) nd
where date = maxdate;
您也可以進行內部聯接。 我包括了所有表創建代碼,以復制測試用例並證明其准確性。
表創建和插入
CREATE TABLE TableNumber (ItemID INT, TableDetailsID INT, Qty INT)
CREATE TABLE TableDetails (ID INT, placed VARCHAR(25), TableDetailsNumber INT, DetailsDate Date)
INSERT INTO TableNumber
values
(111,12121,5),
(111,12121,20),
(112,12121,10),
(123,12121,5),
(111,22121,25),
(111,22121,25),
(123,22121,2)
INSERT INTO TableDetails
values
(12121,'London',555,'2017-05-31'),
(22121,'Dubai',556,'2017-07-31')
詢問
SELECT
TN.ItemID
,TD.Placed
,TD.TableDetailsNumber
,MaxTable.maxDate
,Sum(TN.Qty) 'Qty'
FROM TableNumber TN
JOIN TableDetails TD
on TD.ID = TN.TableDetailsID
JOIN (
SELECT
ItemID
,max(TD.DetailsDate) maxDate
FROM TableNumber TN
JOIN TableDetails TD
on TD.ID = TN.TableDetailsID
GROUP BY
ItemID
) as MaxTable
on MaxTable.maxDate = TD.DetailsDate
and MaxTable.ItemID = TN.ItemID
GROUP BY
tn.ItemId
, td.Placed
, td.TableDetailsNumber
, MaxTable.maxDate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.