SQLServer 2008 R2中使用Cross apply統計最新資料和最近資料_mssql2008

來源:互聯網
上載者:User

使用 APPLY 運算子可以為實現查詢操作的外部表格運算式返回的每個行調用資料表值函式。資料表值函式作為右輸入,外部表格運算式作為左輸入。通過對右輸入求值來獲得左輸入每一行的計算結果,產生的行被組合起來作為最終輸出。APPLY 運算子產生的列的列表是左輸入中的列集,後跟右輸入返回的列的列表。

注意:若要使用 APPLY,資料庫相容層級必須至少為 90。

APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表格中通過資料表值函式產生結果集的行。OUTER APPLY 既返回產生結果集的行,也返回不產生結果集的行,其中資料表值函式產生的列中的值為 NULL。

好久沒寫SQL了,手都有點生了。哈哈,今天回答個問題。順便記錄下來。

事主的需求

事主的問題應該是想把最新的資料和次新資料放在一行裡顯示。

因為沒有說明重複的情況如何處理,即有多個最新資料或者有多個次新資料,所以我沒有做過多的處理。

--by wls----網路代碼有風險--複製粘貼須謹慎USE tempdbGOIF OBJECT_ID('t_TestbyWLS','U') IS NOT NULLDROP TABLE t_TestbyWLSGOCREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT)GOINSERT INTO t_TestbyWLS VALUES('A',,'',.),('B',,'',.)--,('B',,'',.),('A',,'',.),('B',,'',.),('A',,'',.)--,('A',,'',.)GOSELECT * FROM t_TestbyWLSGO/*SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RIDFROM t_TestbyWLSGO*/WITH TempChkDateAS(SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RIDFROM t_TestbyWLS)SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,/*tcd.DRID,tcd.RID,*/t.tcd,t.tpFROM TempChkDate AS tcd CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp FROM TempChkDateWHERE --tcd.DRID= ANDtcd.PName=TempChkDate.PName ANDtcd.PSId=TempChkDate.PSId ANDTempChkDate.Drid= ) AS tWHERE tcd.DRID=GO 

啟動並執行結果應該是正確的。

但是看執行計畫,不是很好啊。

有空再改改。

你可以嘗試一下這個,看看是什麼結果。

產生這種原因是因為你沒有做出具體規定。

--by wls----網路代碼有風險--複製粘貼須謹慎--------------------------------------------------------------------------你可以嘗試一下這個,看看是什麼結果。--產生這種原因是因為沒有做出具體規定。------------------------------------------------------------------------USE tempdbGOIF OBJECT_ID('t_TestbyWLS','U') IS NOT NULLDROP TABLE t_TestbyWLSGOCREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT)GOINSERT INTO t_TestbyWLS VALUES('A',,'',.),('B',,'',.),('B',,'',.),('A',,'',.),('B',,'',.),('A',,'',.),('A',,'',.)GOWITH TempChkDateAS(SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RIDFROM t_TestbyWLS)SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,tcd.DRID,tcd.RID,t.tcd,t.tpFROM TempChkDate AS tcd CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp FROM TempChkDateWHERE --tcd.DRID= ANDtcd.PName=TempChkDate.PName ANDtcd.PSId=TempChkDate.PSId ANDTempChkDate.Drid= ) AS tWHERE tcd.DRID=GO

以上內容是小編給大家介紹的SQLServer 2008 R2中使用Cross apply統計最新資料和最近資料的相關知識,希望對大家有所協助!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.