使用 APPLY 運算符可以為實現(xiàn)查詢操作的外部表表達(dá)式返回的每個行調(diào)用表值函數(shù)。表值函數(shù)作為右輸入,外部表表達(dá)式作為左輸入。通過對右輸入求值來獲得左輸入每一行的計算結(jié)果,生成的行被組合起來作為最終輸出。APPLY 運算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
注意:若要使用 APPLY,數(shù)據(jù)庫兼容級別必須至少為 90。
APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中通過表值函數(shù)生成結(jié)果集的行。OUTER APPLY 既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行,其中表值函數(shù)生成的列中的值為 NULL。
好久沒寫SQL了,手都有點生了。哈哈,今天回答個問題。順便記錄下來。
事主的需求
事主的問題應(yīng)該是想把最新的數(shù)據(jù)和次新數(shù)據(jù)放在一行里顯示。
因為沒有說明重復(fù)的情況如何處理,即有多個最新數(shù)據(jù)或者有多個次新數(shù)據(jù),所以我沒有做過多的處理。
--by wls -- --網(wǎng)絡(luò)代碼有風(fēng)險 --復(fù)制粘貼須謹(jǐn)慎 USE tempdb GO IF OBJECT_ID('t_TestbyWLS','U') IS NOT NULL DROP TABLE t_TestbyWLS GO CREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT) GO INSERT INTO t_TestbyWLS VALUES ('A',,'',.) ,('B',,'',.) --,('B',,'',.) ,('A',,'',.) ,('B',,'',.) ,('A',,'',.) --,('A',,'',.) GO SELECT * FROM t_TestbyWLS GO /* 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 RID FROM t_TestbyWLS GO */ WITH TempChkDate AS ( 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 RID FROM t_TestbyWLS ) SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,/*tcd.DRID,tcd.RID,*/t.tcd,t.tp FROM TempChkDate AS tcd CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp FROM TempChkDate WHERE --tcd.DRID= AND tcd.PName=TempChkDate.PName AND tcd.PSId=TempChkDate.PSId AND TempChkDate.Drid= ) AS t WHERE tcd.DRID= GO
運行的結(jié)果應(yīng)該是正確的。
但是看執(zhí)行計劃,不是很好啊。
有空再改改。
你可以嘗試一下這個,看看是什么結(jié)果。
產(chǎn)生這種原因是因為你沒有做出具體規(guī)定。
--by wls -- --網(wǎng)絡(luò)代碼有風(fēng)險 --復(fù)制粘貼須謹(jǐn)慎 ------------------------------------------------------------------------ --你可以嘗試一下這個,看看是什么結(jié)果。 --產(chǎn)生這種原因是因為沒有做出具體規(guī)定。 ------------------------------------------------------------------------ USE tempdb GO IF OBJECT_ID('t_TestbyWLS','U') IS NOT NULL DROP TABLE t_TestbyWLS GO CREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT) GO INSERT INTO t_TestbyWLS VALUES ('A',,'',.) ,('B',,'',.) ,('B',,'',.) ,('A',,'',.) ,('B',,'',.) ,('A',,'',.) ,('A',,'',.) GO WITH TempChkDate AS ( 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 RID FROM t_TestbyWLS ) SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,tcd.DRID,tcd.RID,t.tcd,t.tp FROM TempChkDate AS tcd CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp FROM TempChkDate WHERE --tcd.DRID= AND tcd.PName=TempChkDate.PName AND tcd.PSId=TempChkDate.PSId AND TempChkDate.Drid= ) AS t WHERE tcd.DRID= GO
以上內(nèi)容是小編給大家介紹的SQLServer 2008 R2中使用Cross apply統(tǒng)計最新數(shù)據(jù)和最近數(shù)據(jù)的相關(guān)知識,希望對大家有所幫助!
標(biāo)簽:仙桃 唐山 平頂山 惠州 長白山 貴港 茂名 潛江
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQLServer 2008 R2中使用Cross apply統(tǒng)計最新數(shù)據(jù)和最近數(shù)據(jù)》,本文關(guān)鍵詞 SQLServer,2008,中,使用,Cross,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。