sql数据十等分,并更新

yutian_31 2010-09-16 03:17:28
例如一个表 table 表中有 id,value ,rate 三个字段
以value 来排序
找出前十分之1数据并把相应的rate 置为10
找出前十分之2且不包含前十分之一的数据并把rate置 为9
找出前十分之3且不包含前十分之2的数据并把rate置为8
。。。。。

我目前的做法是
十分之一:
update table set rate=10
where id in(select top 10 percent id from table order by value desc)
十分之二:
update table set rate=9
where id in(
select id from(
select top 20 percent id from table order by value desc
) a
where a.id not in (select top 10 percent id from table order by value desc)
)

哪位大侠有好的方法或者效率更高的,给指点下,小弟先谢过了...
...全文
1417 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
siegebaoniu 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yutian_31 的回复:]
一样吧,先前十分之3的时候我还是要排除掉前十分之2的数据啊
[/Quote]
我觉得不用排除的,做十分之2的时候应该会覆盖的吧。


不过9楼的方法很赞
yutian_31 2010-09-16
  • 打赏
  • 举报
回复
楼上厉害,我的是2005 一条语句省了我很多重复代码
feilniu 2010-09-16
  • 打赏
  • 举报
回复
如果是SQLServer2000可以这样:

SELECT id, value, SN = IDENTITY(int,1,1)
INTO #temp
FROM [table]
ORDER BY value

UPDATE tbl SET tbl.rate = (tmp.SN - 1) / (SELECT COUNT(*) / 10 FROM #temp) + 1
FROM [table] tbl
INNER JOIN #temp tmp
ON tbl.id = tmp.id

feilniu 2010-09-16
  • 打赏
  • 举报
回复
如果是SQLServer2005以上可以这样:

WITH CTE AS(SELECT *, tile = NTILE(10) OVER(ORDER BY value) FROM [table])
UPDATE CTE SET rate = tile

ribuluo1314 2010-09-16
  • 打赏
  • 举报
回复
有用的,谢谢
yutian_31 2010-09-16
  • 打赏
  • 举报
回复
一样吧,先前十分之3的时候我还是要排除掉前十分之2的数据啊
siegebaoniu 2010-09-16
  • 打赏
  • 举报
回复
我觉得你应该从下至上,先前十分之3,再十分之2,最后十分之一...
喜-喜 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 billpu 的回复:]
能解决问题的办法就是好办法 恭喜
[/Quote]

赞同..
yutian_31 2010-09-16
  • 打赏
  • 举报
回复
还有别的思路没?因为我有一个表中的字段很多都要这么做 很麻烦
ws_hgo 2010-09-16
  • 打赏
  • 举报
回复
你这个方法可以
billpu 2010-09-16
  • 打赏
  • 举报
回复
能解决问题的办法就是好办法 恭喜

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧