手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据
SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据
摘要:使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来...

使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

注意:若要使用 APPLY,数据库兼容级别必须至少为 90。

APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。

好久没写SQL了,手都有点生了。哈哈,今天回答个问题。顺便记录下来。

SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据1

事主的需求

SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据2

事主的问题应该是想把最新的数据和次新数据放在一行里显示。

因为没有说明重复的情况如何处理,即有多个最新数据或者有多个次新数据,所以我没有做过多的处理。

--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

运行的结果应该是正确的。

但是看执行计划,不是很好啊。

SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据3

有空再改改。

你可以尝试一下这个,看看是什么结果。

产生这种原因是因为你没有做出具体规定。

--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统计最新数据和最近数据的相关知识,希望对大家有所帮助!

【SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据】相关文章:

SQL Server 2005 返回修改后的数据

SQLServer2008数据库备份还原和数据恢复

详解SQLServer 2008 R2数据库SSAS建模及扩展能力

SQL Server 2008 维护计划实现数据库备份心得

SQL Server 2008 数据库中创建只读用户的方法

SQLSERVER 2005中使用sql语句对xml文件和其数据的进行操作(很全面)

SQL Server 2000中修改数据库COLLATE的实例

SQL Server 2008网络协议深入理解

使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

SQL server 2008 数据安全(备份和恢复数据库)

精品推荐
分类导航