首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算排名和更新原始表的MySQL

计算排名和更新原始表的MySQL
EN

Stack Overflow用户
提问于 2014-09-09 17:13:30
回答 2查看 137关注 0票数 0

MySQL服务器5.6.20 (目前最新版本)

按日期表计算价格。我添加了一个新列"Rank",它表示按日期对商品价格的排名。

代码语言:javascript
复制
Date      Item  Price  Rank
1/1/2014  A     5.01   0  
1/1/2014  B     31     0  
1/1/2014  C     1.5    0  
1/2/2014  A     5.11   0  
1/2/2014  B     20     0  
1/2/2014  C     5.5    0  
1/3/2014  A     30     0  
1/3/2014  B     11.01  0  
1/3/2014  C     22     0  

如何编写SQL语句来计算排名和更新原始表?下面是预期的表格,并填写了排名。排名计算按日期分组(1/1、1/2、1/3等)。

代码语言:javascript
复制
Date      Item  Price  Rank
1/1/2014  A     5.01   2  
1/1/2014  B     31     1  
1/1/2014  C     1.5    3  
1/2/2014  A     5.11   3  
1/2/2014  B     20     1  
1/2/2014  C     5.5    2  
1/3/2014  A     30     1  
1/3/2014  B     11.01  3  
1/3/2014  C     22     2  

此外,如果几个项目的价格是相同的,MySQL将如何处理排名?例如:

代码语言:javascript
复制
Date      Item  Price  Rank
1/4/2014  A     31     0  
1/4/2014  B     31     0  
1/4/2014  C     1.5    0  

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-09 17:42:01

您可以使用变量在查询中获得排名:

代码语言:javascript
复制
  select t.*,
         (@rn := if(@d = date, @rn + 1,
                    if(@d := date, 1, 1)
                   )
         ) as rank
  from pricebydate t cross join
       (select @d := NULL, @rn := 0) vars
  order by date, price desc;

您可以使用update将其放入join中。

代码语言:javascript
复制
update pricebydate pbd join
       (select t.*,
             (@rn := if(@d = date, @rn + 1,
                        if(@d := date, 1, 1)
                       )
             ) as rank
        from pricebydate t cross join
             (select @d := NULL, @rn := 0) vars
        order by date, price desc
       ) r
       on pbd.date = r.date and pbd.item = item
    set pbd.rank = r.rank;
票数 3
EN

Stack Overflow用户

发布于 2014-09-09 17:37:34

我相信这能做你想做的事:

代码语言:javascript
复制
Update YourTable As T1                                   
Set    ItemRank = (                                               
    Select ItemRank From (                                         
        Select Rank() Over (Partition By ItemDate Order By Price Desc) 
        As ItemRank, Item, ItemDate                                    
        From YourTable                                            
    ) As T2                                                        
    Where T2.Item = T1.Item                                        
    And   T2.ItemDate = T1.ItemDate                                
)                                                              

重复的职级将被处理为拥有同等的级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25750390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档