SQLServer 2008 R2中使用Cross apply統(tǒng)計(jì)最新數(shù)據(jù)和最近數(shù)據(jù)
使用 APPLY 運(yùn)算符可以為實(shí)現(xiàn)查詢操作的外部表表達(dá)式返回的每個(gè)行調(diào)用表值函數(shù)。表值函數(shù)作為右輸入,外部表表達(dá)式作為左輸入。通過(guò)對(duì)右輸入求值來(lái)獲得左輸入每一行的計(jì)算結(jié)果,生成的行被組合起來(lái)作為最終輸出。APPLY 運(yùn)算符生成的列的列表是左輸入中的列集,后跟右輸入返回的列的列表。
注意:若要使用 APPLY,數(shù)據(jù)庫(kù)兼容級(jí)別必須至少為 90。
APPLY 有兩種形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅返回外部表中通過(guò)表值函數(shù)生成結(jié)果集的行。OUTER APPLY 既返回生成結(jié)果集的行,也返回不生成結(jié)果集的行,其中表值函數(shù)生成的列中的值為 NULL。
好久沒寫SQL了,手都有點(diǎn)生了。哈哈,今天回答個(gè)問題。順便記錄下來(lái)。

事主的需求

事主的問題應(yīng)該是想把最新的數(shù)據(jù)和次新數(shù)據(jù)放在一行里顯示。
因?yàn)闆]有說(shuō)明重復(fù)的情況如何處理,即有多個(gè)最新數(shù)據(jù)或者有多個(gè)次新數(shù)據(jù),所以我沒有做過(guò)多的處理。
--by wls
--
--網(wǎng)絡(luò)代碼有風(fēng)險(xiǎn)
--復(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í)行計(jì)劃,不是很好啊。

有空再改改。
你可以嘗試一下這個(gè),看看是什么結(jié)果。
產(chǎn)生這種原因是因?yàn)槟銢]有做出具體規(guī)定。
--by wls
--
--網(wǎng)絡(luò)代碼有風(fēng)險(xiǎn)
--復(fù)制粘貼須謹(jǐn)慎
------------------------------------------------------------------------
--你可以嘗試一下這個(gè),看看是什么結(jié)果。
--產(chǎn)生這種原因是因?yà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)計(jì)最新數(shù)據(jù)和最近數(shù)據(jù)的相關(guān)知識(shí),希望對(duì)大家有所幫助!
相關(guān)文章
mssql 監(jiān)控磁盤空間告警實(shí)現(xiàn)方法
需要通過(guò)調(diào)用OLE 自動(dòng)存儲(chǔ)過(guò)程獲取磁盤信息,而這些組件,基于服務(wù)器的安全配置,通常是禁用的,我們?cè)诖鎯?chǔ)過(guò)程通過(guò)sp_configure開啟這個(gè)服務(wù),調(diào)用服務(wù)完畢后,又通過(guò)sp_configure禁用該服務(wù)。另外,數(shù)據(jù)庫(kù)服務(wù)器都位于內(nèi)網(wǎng),因此安全問題應(yīng)該不大2013-08-08
sqlserver2008查看表記錄或者修改存儲(chǔ)過(guò)程出現(xiàn)目錄名無(wú)效錯(cuò)誤解決方法
登陸數(shù)據(jù)庫(kù)后,右鍵打開表提示:目錄名無(wú)效,執(zhí)行SQL語(yǔ)句也提示有錯(cuò)誤,現(xiàn)在把解決方法分享給大家2014-01-01
一個(gè)簡(jiǎn)單的后臺(tái)與數(shù)據(jù)庫(kù)交互的登錄與注冊(cè)[sql注入處理、以及MD5加密]
這篇文章主要介紹了一個(gè)簡(jiǎn)單的后臺(tái)與數(shù)據(jù)庫(kù)交互的登錄與注冊(cè),包含sql注入處理、以及MD5加密知識(shí)點(diǎn)介紹2016-07-07
SQL Server 2008 R2 應(yīng)用及多服務(wù)器管理
所謂多服務(wù)器管理 (Multiserver Administration)就是SQL Server 2008 R2提供的自動(dòng)管理多個(gè) SQL Server 實(shí)例過(guò)程的功能。在多服務(wù)器管理中,連接到主服務(wù)器并從其接收作業(yè)的服務(wù)器被稱之為目標(biāo)服務(wù)器。2014-10-10
sql server 2008數(shù)據(jù)庫(kù)連接字符串大全
這篇文章主要介紹了sql server 2008數(shù)據(jù)庫(kù)的連接字符串大全,需要的朋友可以參考下2014-03-03
SQL Server 2008 數(shù)據(jù)庫(kù)鏡像部署實(shí)例之一 數(shù)據(jù)庫(kù)準(zhǔn)備
利用Sql Server 2008 enterprise X64,建立異步(高性能)鏡像數(shù)據(jù)庫(kù),同時(shí)建立見證服務(wù)器實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移2013-11-11

