• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 雪落无声 | 发布时间: 2025-6-18 12:36| 查看数: 56| 评论数: 0|帖子模式

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

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

    APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
    好久没写SQL了,手都有点生了。哈哈,今天回答个问题。顺便记录下来。


    事主的需求


    事主的问题应该是想把最新的数据和次新数据放在一行里显示。
    因为没有说明重复的情况如何处理,即有多个最新数据或者有多个次新数据,所以我没有做过多的处理。
    1. --by wls
    2. --
    3. --网络代码有风险
    4. --复制粘贴须谨慎
    5. USE tempdb
    6. GO
    7. IF OBJECT_ID('t_TestbyWLS','U') IS NOT NULL
    8. DROP TABLE t_TestbyWLS
    9. GO
    10. CREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT)
    11. GO
    12. INSERT INTO t_TestbyWLS VALUES
    13. ('A',,'',.)
    14. ,('B',,'',.)
    15. --,('B',,'',.)
    16. ,('A',,'',.)
    17. ,('B',,'',.)
    18. ,('A',,'',.)
    19. --,('A',,'',.)
    20. GO
    21. SELECT * FROM t_TestbyWLS
    22. GO
    23. /*
    24. SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,
    25. ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RID
    26. FROM t_TestbyWLS
    27. GO
    28. */
    29. WITH TempChkDate
    30. AS
    31. (
    32. SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,
    33. ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RID
    34. FROM t_TestbyWLS
    35. )
    36. SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,/*tcd.DRID,tcd.RID,*/t.tcd,t.tp
    37. FROM TempChkDate AS tcd CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp
    38. FROM TempChkDate
    39. WHERE
    40. --tcd.DRID= AND
    41. tcd.PName=TempChkDate.PName AND
    42. tcd.PSId=TempChkDate.PSId AND
    43. TempChkDate.Drid=
    44. ) AS t
    45. WHERE tcd.DRID=
    46. GO
    复制代码
    运行的结果应该是正确的。

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

    有空再改改。

    你可以尝试一下这个,看看是什么结果。
    产生这种原因是因为你没有做出具体规定。
    1. --by wls
    2. --
    3. --网络代码有风险
    4. --复制粘贴须谨慎
    5. ------------------------------------------------------------------------
    6. --你可以尝试一下这个,看看是什么结果。
    7. --产生这种原因是因为没有做出具体规定。
    8. ------------------------------------------------------------------------
    9. USE tempdb
    10. GO
    11. IF OBJECT_ID('t_TestbyWLS','U') IS NOT NULL
    12. DROP TABLE t_TestbyWLS
    13. GO
    14. CREATE TABLE t_TestbyWLS(PName NVARCHAR(),PSId INTEGER,ChkDate NVARCHAR(),Price FLOAT)
    15. GO
    16. INSERT INTO t_TestbyWLS VALUES
    17. ('A',,'',.)
    18. ,('B',,'',.)
    19. ,('B',,'',.)
    20. ,('A',,'',.)
    21. ,('B',,'',.)
    22. ,('A',,'',.)
    23. ,('A',,'',.)
    24. GO
    25. WITH TempChkDate
    26. AS
    27. (
    28. SELECT PName,PSId,ChkDate,Price,DENSE_RANK() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC ) AS DRID,
    29. ROW_NUMBER() OVER(PARTITION BY PName ORDER BY CAST(Chkdate AS INTEGER) DESC,Price DESC ) AS RID
    30. FROM t_TestbyWLS
    31. )
    32. SELECT tcd.PName,tcd.PSID,tcd.ChkDate,tcd.Price,tcd.DRID,tcd.RID,t.tcd,t.tp
    33. FROM TempChkDate AS tcd
    34. CROSS APPLY(SELECT ChkDate AS tcd, Price AS tp
    35. FROM TempChkDate
    36. WHERE
    37. --tcd.DRID= AND
    38. tcd.PName=TempChkDate.PName AND
    39. tcd.PSId=TempChkDate.PSId AND
    40. TempChkDate.Drid=
    41. ) AS t
    42. WHERE tcd.DRID=
    43. GO
    复制代码
    以上内容是小编给大家介绍的SQLServer 2008 R2中使用Cross apply统计最新数据和最近数据的相关知识,希望对大家有所帮助!

    来源:https://www.jb51.net/article/80084.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表