程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL2008 >> SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據

SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據

編輯:MSSQL2008

SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據。本站提示廣大學習愛好者:(SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據正文


運用 APPLY 運算符可以為完成查詢操作的內部表表達式前往的每個行調用表值函數。表值函數作為右輸出,內部表表達式作為左輸出。經過對右輸出求值來取得左輸出每一行的計算後果,生成的行被組合起來作為最終輸入。APPLY 運算符生成的列的列表是左輸出中的列集,後跟右輸出前往的列的列表。

留意:若要運用 APPLY,數據庫兼容級別必需至多為 90。

APPLY 有兩種方式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 僅前往內部表中經過表值函數生成後果集的行。OUTER APPLY 既前往生成後果集的行,也前往不生成後果集的行,其中表值函數生成的列中的值為 NULL。

良久沒寫SQL了,手都有點生了。哈哈,明天答復個問題。特地記載上去。

事主的需求

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

由於沒有闡明反復的狀況如何處置,即有多個最新數據或許有多個次新數據,所以我沒有做過多的處置。

--by wls
--
--網絡代碼有風險
--復制粘貼須慎重
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 

運轉的後果應該是正確的。

但是看執行方案,不是很好啊。

有空再改改。

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

發生這種緣由是由於你沒有做出詳細規則。

--by wls
--
--網絡代碼有風險
--復制粘貼須慎重
------------------------------------------------------------------------
--你可以嘗試一下這個,看看是什麼後果。
--發生這種緣由是由於沒有做出詳細規則。
------------------------------------------------------------------------
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

以上內容是給大家引見的SQLServer 2008 R2中運用Cross apply統計最新數據和最近數據的相關知識,希望對大家有所協助!

  1. 上一頁:
  2. No
Copyright © 程式師世界 All Rights Reserved