手机
当前位置:查字典教程网 >编程开发 >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将远程数据库导入到本地的方法

SQL Server 2005 数据库复制详细介绍

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

SQL Server 2005 开启数据库远程连接的方法

SQL Server 2008 备份数据库、还原数据库的方法

SQL Server 2005 中使用 Try Catch 处理异常

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

SQL Server 2005使用的网络协议

sql Server 2008 R2还原或删除数据库时总是出错的解决方法

SQL Server2005 中的数据类型总结

精品推荐
分类导航