2014-10-20 34 views
0

我有一个用户表,其中包含钱,级别和排名。根据另一个排序更新字段

Id | money| ranking| level 
--------------------------- 
1 |30000| 1   1 
2 |20000| 2   3 
3 |10000| 3   2 
4 |50000| 4   2 

我想根据用户级别(第一个过滤器)和金钱更新排名字段。

这是更高级别的用户将始终排名较高。

这就是我想要的表像这样在更新后:

Id | money| ranking| level 
--------------------------- 
1 |30000| 4   1 
2 |20000| 1   3 
3 |10000| 3   2 
4 |50000| 2   2 

谢谢!

+0

如果两个用户的钱和水平相同,会怎样?你也需要存储或只是'选择'这个? – 2014-10-20 19:55:30

+0

@MartinSmith,OP确实说'更新字段' – paqogomez 2014-10-20 19:56:41

+0

@paqogomez,但他们真的*需要这个吗?他们如何计划与变化保持同步? – 2014-10-20 19:57:58

回答

1

作为一个说明,我不会将该字段存储在数据库中 - 存储依赖于表中其他记录的值会使维护变得更加困难。

这里,将工作作为视图或存储过程中的查询:

SELECT 
    ID, 
    [money], 
    ROW_NUMBER() OVER (order by [level] desc, [money] desc) AS [ranking], 
    [level] 
FROM myTable 

如果你真的想要更新表只是使查询子查询的更新:

UPDATE m1 
    SET ranking = m2.ranking 
FROM myTable m1 
INNER JOIN 
    (SELECT 
     ID, 
     ROW_NUMBER() OVER (order by [level] desc, [money] desc) ranking 
    FROM myTable) m2 
    ON m1.ID = m2.ID 
0
CREATE TABLE #tt 
    (
    id  INT, 
    mony INT, 
    ranking INT, 
    levell INT 
) 

INSERT INTO #tt 
VALUES  (1,30000,1,1), 
      (2,20000,2,3), 
      (3,10000,3,2), 
      (4,50000,4,2) 

UPDATE a 
SET ranking = rnk 
FROM #tt a 
     JOIN (SELECT Row_number() 
         OVER (
         ORDER BY levell DESC, mony DESC) AS rnk, 
        * 
      FROM #tt) b 
     ON a.levell = b.levell 
      AND a.mony = b.mony 
1

如果你只是想选择那么这里就是查询:

select *, dense_rank() over (order by level desc, mony desc) as newranking from YourTable 

,如果要更新,然后:

;with cte_toupdate (ranking, newranking) 
as (
select ranking, dense_rank() over (order by level desc, mony desc) as newranking from YourTable 
) 

Update cte_toupdate set ranking = newranking 

select * from YourTable 

检查这里:http://sqlfiddle.com/#!3/8d6d3/10

注意:如果你想独特的行列,然后使用ROW_NUMBER(),而不是DENSE_RANK()。

相关问题