SQLServer 2008 R2中使用Cross apply統(tǒng)計最新數(shù)據(jù)和最近數(shù)據(jù)
使用 APPLY 運(yùn)算符可以為實(shí)現(xiàn)查詢操作的外部表表達(dá)式返回的每個行調(diào)用表值函數(shù)。表值函數(shù)作為右輸入,外部表表達(dá)式作為左輸入。通過對右輸入求值來獲得左輸入每一行的計算結(jié)果,生成的行被組合起來作為最終輸出。APPLY 運(yùn)算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
注意:若要使用 APPLY,數(shù)據(jù)庫兼容級別必須至少為 90。
APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中通過表值函數(shù)生成結(jié)果集的行。OUTER APPLY 既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行,其中表值函數(shù)生成的列中的值為 NULL。
好久沒寫SQL了,手都有點(diǎn)生了。哈哈,今天回答個問題。順便記錄下來。
事主的需求
事主的問題應(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
運(yùn)行的結(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)知識,希望對大家有所幫助!
相關(guān)文章
mssql 監(jiān)控磁盤空間告警實(shí)現(xiàn)方法
需要通過調(diào)用OLE 自動存儲過程獲取磁盤信息,而這些組件,基于服務(wù)器的安全配置,通常是禁用的,我們在存儲過程通過sp_configure開啟這個服務(wù),調(diào)用服務(wù)完畢后,又通過sp_configure禁用該服務(wù)。另外,數(shù)據(jù)庫服務(wù)器都位于內(nèi)網(wǎng),因此安全問題應(yīng)該不大2013-08-08sqlserver2008查看表記錄或者修改存儲過程出現(xiàn)目錄名無效錯誤解決方法
登陸數(shù)據(jù)庫后,右鍵打開表提示:目錄名無效,執(zhí)行SQL語句也提示有錯誤,現(xiàn)在把解決方法分享給大家2014-01-01一個簡單的后臺與數(shù)據(jù)庫交互的登錄與注冊[sql注入處理、以及MD5加密]
這篇文章主要介紹了一個簡單的后臺與數(shù)據(jù)庫交互的登錄與注冊,包含sql注入處理、以及MD5加密知識點(diǎn)介紹2016-07-07SQL Server 2008 R2 應(yīng)用及多服務(wù)器管理
所謂多服務(wù)器管理 (Multiserver Administration)就是SQL Server 2008 R2提供的自動管理多個 SQL Server 實(shí)例過程的功能。在多服務(wù)器管理中,連接到主服務(wù)器并從其接收作業(yè)的服務(wù)器被稱之為目標(biāo)服務(wù)器。2014-10-10sql server 2008數(shù)據(jù)庫連接字符串大全
這篇文章主要介紹了sql server 2008數(shù)據(jù)庫的連接字符串大全,需要的朋友可以參考下2014-03-03SQL Server 2008 數(shù)據(jù)庫鏡像部署實(shí)例之一 數(shù)據(jù)庫準(zhǔn)備
利用Sql Server 2008 enterprise X64,建立異步(高性能)鏡像數(shù)據(jù)庫,同時建立見證服務(wù)器實(shí)現(xiàn)自動故障轉(zhuǎn)移2013-11-11