在写一个存储过程中,遇到了一个问题,自己写的SQL总是运行效率太低,于是上网搜索,学到了一个新招,都怪自己平时不爱学习啊,不过这个语法真的很厉害。
需求:取一个表中每个id的最新三条数据(按照更新时间倒序取)
SELECT * FROM #T AS T WHERE 3>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)
或是SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 3 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)
这是我的写法,一共运行了。。。反正半分钟后我就点了取消
网上有两个写法1 )使用 APPLYSELECT DISTINCT b.* FROM #T AS a CROSS APPLY ( SELECT TOP(3) * FROM #T WHERE a.GID=GID ORDER BY Date DESC ) AS b
2 )使用 ROW_NUMBER() 进行排位分组SELECT ID,GID,Author,Title,Date FROM ( SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC), * FROM #T ) AS T WHERE rid<=3
表格共有7万多行数据,字段大概20个,第1)种方法运行9秒,第2)种方法运行3秒,网上牛人果然很多,受教了。