天天看點

LEFT JOIN 分組每組排序後的第一條

  • 設定:

    合同表:A 唯一辨別為ID,每個合同一個ID

    流程表:B 無唯一辨別,合同審批流程每一步都生成一條

    AppO_Values:對應合同表的ID,

    App_Order: 對應審批步驟,

    UserID: 審批人ID

  • 需求

    查詢出所有合同表,及目前審批人

  • 思路

    SELECT * A 然後 LEFT JOIN 流程表

  • 問題

    每個合同查詢出多條記錄

  • 解決辦法

    對流程表按對應合同表的ID也就是AppO_Values分組,每個組取第一條也就是目前審批人

  • SQL語句
  1. 方法一:使用ROW_NUMBER函數

    SELECT * FROM A a LEFT JOIN (select * from (select ROW_NUMBER()over(partition by AppO_Values order by App_Order desc) rowId,* from B ) as AuctionRecords

    where rowId=1) c ON a.ID = c.AppO_Values

參考:https://blog.csdn.net/qq_16990363/article/details/53466255

https://zhidao.baidu.com/question/365822881.html

2. 方法二:使用max函數

select * 
from a aa left join
b bb on aa.AppO_Values = bb.AppO_Values and bb.App_Order = (select max(App_Order) from b where AppO_Values = bb.AppO_Values )
           

參考:https://bbs.csdn.net/topics/350135010

因為不需要插入一行rowid是以速度理論上會快一點,驗證

驗證語句

declare @d datetime
set @d=getdate()
/*你的SQL腳本開始*/



/*你的SQL腳本結束*/
select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())
           

方法一耗時2186

方法二耗時19660

另,驗證語句位址:https://www.cnblogs.com/xcsn/p/7773212.html