簡體   English   中英

如何使用SQL Server獲取max(date)的行記錄?

[英]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 byorder by

如果我們partition by ItemId並按order by Date desc則每個ItemId具有最新Date的行的row_number()1

這樣,我們可以使用子查詢, 公共表表達式top with ties過濾聯接和聚合的結果。

使用top with tiesrow_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);

或帶有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;

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM