SQLServer 2008 R2中使用Cross apply統(tǒng)計最新數(shù)據(jù)和最近數(shù)據(jù)
使用 APPLY 運算符可以為實現(xiàn)查詢操作的外部表表達式返回的每個行調(diào)用表值函數(shù)。表值函數(shù)作為右輸入,外部表表達式作為左輸入。通過對右輸入求值來獲得左輸入每一行的計算結(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)知識,希望對大家有所幫助!
相關(guān)文章
sqlserver2008鎖表語句詳解(鎖定數(shù)據(jù)庫一個表)
鎖一個SQL表的語句是SQL數(shù)據(jù)庫使用者都需要知道的,下面就將為您介紹鎖SQL表的語句,希望對您學(xué)習(xí)鎖SQL表方面能有所幫助2013-12-12
SQL Server 2008存儲結(jié)構(gòu)之GAM、SGAM介紹
談到GAM和SGAM,我們不得不從數(shù)據(jù)庫的頁和區(qū)說起。一個數(shù)據(jù)庫由用戶定義的空間構(gòu)成,這些空間用來永久存儲用戶對象,例如數(shù)據(jù)庫管理信息、表和索引。這些空間被分配在一個或多個操作系統(tǒng)文件中2012-08-08
SQL server 2008 數(shù)據(jù)庫優(yōu)化常用腳本
這篇文章主要介紹了SQL server 2008 數(shù)據(jù)庫優(yōu)化常用腳本,需要的朋友可以參考下2015-10-10
SQL Server 2008 R2 為用戶權(quán)限分配的操作步驟
這篇文章主要介紹了SQL Server 2008 R2 為用戶權(quán)限分配的操作步驟,有時候我們不得不設(shè)置一些權(quán)限,例如禁止刪除等,那么就可以參考下面的方法2017-10-10
SQL Server 2008數(shù)據(jù)庫設(shè)置定期自動備份的方法
這篇文章主要給大家介紹了關(guān)于SQL Server 2008數(shù)據(jù)庫設(shè)置定期自動備份的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家學(xué)習(xí)或者使用SQL Server2008具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-11-11
SQL Server 2008中SQL之WaitFor使用介紹
在SQL Server 2005以上版本中,在一個增強的WaitFor命令,其作用可以和一個job相當(dāng)。但使用更加簡捷2011-05-05
win2008 enterprise R2 x64 中安裝SQL server 2008的方法
這篇文章主要介紹了win2008 enterprise R2 x64 中安裝SQL server 2008的方法,需要的朋友可以參考下2015-07-07

