排名趋势公式

开始

这里有个连续几个月的个人销售数据,如:

图1.

要求对个人销量按月进行排名,还能够描述出一个人在连续几个月的排名趋势,是上升还是下降,连续上升多少个月,连续下降多少个月,如图2.

图2.

分析

由于要描述连续升和连续降的特点,每月的连续升降,需要参考本月之前的排名情况,所以最好是通过实体表来存储每月的排名数据。如图3.

图3.

在 图3,中,有一个字段RankTrend描述排名趋势,正数(+n)表示上升,负数(-n)表示下降,0表示第一次排名或名次不变。

场景1:第一次排名从0开始计数,下个月名次上升的情况,RankTrend +=1, 反之,名次出现下降 ,RankTrend -=1 。

图4.

Kent 在1月份第一次加入排名,1月排名趋势为0;2月份,名次从第4名升到第2名,属于上升趋势,那么RankTrend +=1; 3月也是一样,从2月的第2名升到第1名,那么RankTrend +=1;

图5.

John 在1月份第一次加入排名,1月排名趋势为0;2月份,名次从第1名降到第5名,属于下降趋势,那么RankTrend -=1; 3月也是一样,从2月的第5名降到第6名,那么RankTrend -=1;

场景2:上个月的排名趋势是上升的,即RankTrend = (+n), 本月排名突然下降,那么RankTrend = (-1),这里不能直接RankTrend -=1,因为直接减1不能体现连续升降趋势。

图6.

分析方法如前面(略.)

场景3:上个月的排名趋势是下降的,即RankTrend = (-n), 本月排名突然下降,那么RankTrend = (+1),这里不能直接RankTrend +=1,因为直接加1不能体现连续升降趋势。

图7.

分析方法如前面(略.)

排名趋势公式

根据前面的分析,我们涉及到一些数值,(+n),(-n) ,-1 , 1 , 0 。结合这些数,我们可以通过一个简单的数字组合和位运算,整理得出一个排名趋势公式:

【排名趋势】 =  isnull( sign( [上月名次] - [本月名次] ) + [上月排名趋势值] x ( 1 - abs(sign( sign([上月名次] - [本月名次]) XOR sign([上月排名趋势值]) )) ) ,0)

[注明]:

  • isnull()函数是判断Null的时候取0
  • sign() 函数是正负函数,返回-1,0,1
  • abs() 函数是取绝对值
  • XOR 表示异或运算

具体可以自己去拆分,这里暂时不详解。

测试例子

1.建表和Insert 测试数据

use tempdb
go
if object_id(‘PersonalSalesRank‘) Is not null drop Table PersonalSalesRank
go
create table PersonalSalesRank(Name nvarchar(20),YM date, SalesQty int ,RankNr int,RankTrend int)
go
set nocount on
insert into dbo.PersonalSalesRank ( Name , YM , SalesQty  )
    values
--2017-01
    (‘Kent‘,‘20170101‘,400),
    (‘John‘,‘20170101‘,758),
    (‘Rob‘,‘20170101‘,365),
    (‘Ruben‘,‘20170101‘,487),
    (‘Andy‘,‘20170101‘,651),
--2017-02
    (‘Andy‘,‘20170201‘,668),
    (‘Christy‘,‘20170201‘,541),
    (‘Kent‘,‘20170201‘,712),
    (‘Ruben‘,‘20170201‘,729),
    (‘Rob‘,‘20170201‘,365),
    (‘John‘,‘20170201‘,465),
--2017-03
    (‘Andy‘,‘20170301‘,651),
    (‘Christy‘,‘20170301‘,588),
    (‘Kent‘,‘20170301‘,769),
    (‘Ruben‘,‘20170301‘,752),
    (‘Rob‘,‘20170301‘,552),
    (‘John‘,‘20170301‘,421)

go

2.创建排名趋势函数

if object_id(‘fn_RankTrend‘) Is not null drop function  fn_RankTrend
go
/********************************************************************************************
%% Program Name    :fn_RankTrend
%% Author        : Andy.Wei
%% Description    :
%% InParameter    :
%% OutParameter    :
%% Created Date    : 2017-05-12
%% Revision History :
%% Modified Date Modified By  version Description
%%
********************************************************************************************/
create function fn_RankTrend
(
    @CurrentRankNr int,
    @LastRankNr int,
    @LastRankTrend int
)
returns int
as
begin

    return(isnull(sign( @LastRankNr - @CurrentRankNr) + @LastRankTrend * ( 1 - abs(sign( sign(@LastRankNr - @CurrentRankNr)^sign(@LastRankTrend) )) ) ,0))
end
go

3. 计算排名

--排名
;with cte_Rank as
(
    select  RankNr,dense_rank() over(partition by YM order by SalesQty desc) as RankNr_1 from dbo.PersonalSalesRank
)
update a
    set a.RankNr=a.RankNr_1
    from cte_Rank a

4. 计算排名趋势

--更新排名趋势
declare @YM date=‘20170101‘
while(1=1)
begin
    update a
        set a.RankTrend=dbo.fn_RankTrend(a.RankNr,b.RankNr,b.RankTrend)
        from dbo.PersonalSalesRank a
            left join dbo.PersonalSalesRank b on b.Name=a.Name
                and b.YM=dateadd(month,-1,@YM)
        where a.YM=@YM;
    if @@ROWCOUNT =0 break;
    print @YM
    set @YM=dateadd(month,1,@YM)
end

5. 测试

select    name as [姓名],
        convert(char(7),a.YM,121) as [月份],
        a.SalesQty as [销量],
        convert(nvarchar(20),N‘第 ‘+rtrim(a.RankNr)+N‘ 名‘) as [排名],
        case sign(a.RankTrend)
            when -1 then N‘↓‘
            when 1  then N‘↑‘
            else N‘‘
        end as [排名升降],
        case
            when a.RankTrend>=2 then N‘连续‘+rtrim(abs(a.RankTrend))+N‘月‘
            else N‘‘
        end as [连续上升],
        case
            when a.RankTrend<=-2 then N‘连续‘+rtrim(abs(a.RankTrend))+N‘月‘
            else N‘‘
        end as [连续下降]
    from dbo.PersonalSalesRank a
    order by 2,3 desc
go

最后

这只是一个简单的例子,但可以从简单的例子发现一些事物的某种共性,由此可以明白它可以应用于相识而不同的各种应用案例中。

时间: 2024-10-16 14:37:35

排名趋势公式的相关文章

基于贝叶斯估计的星级得分排名

问题阐述 互联网早已成为人们生活的一部分,没事在网上看看电影.逛逛淘宝.定定外卖(有时间还是要多出去走走).互联网的确为我们提供了非常多的便利,但它毕竟是一个虚拟的环境,具有更多的不确定性,大多数情况下我们只能通过别人的评论及打分来判别某个商品的好坏.五星打分是许多网站采用的商品排名方法,它也是消费者最直观最简单的评价尺度,我想大部分人都会去点击那些星级排名比较高的商品以最大限度降低我们的顾虑. 多数情况下,星级排名都能准确的反映一个商品的好坏,因为它是多人的一个综合得分,减小了个人偏好的影响.

推荐系统相关算法

摘要: 热门推荐 协同过滤算法 矩阵分解 基于内容的推荐(文本,标签,特征/profile)   基于图的算法 内容: 热门推荐: 热门推荐本质上是一个排行榜,可能会考虑到时间衰减,商品的销量/流行度,好评,差评等因素,对于新用户引导有一定的作用,但是并不是一个个性化的算法 以下是一些热门排名的公式实现: 1 def hacker_news_rank( ): 2 #参考自http://www.oschina.net/news/43456/how-hacker-news-ranking-algor

Linux 抓取网页方式(curl+wget)

Linux抓取网页,简单方法是直接通过 curl 或 wget 两种命令. curl 和 wget支持协议 curl  支持 http,https,ftp,ftps,scp,telnet等网络协议 wget支持 http,https,ftp网络协议 curl 和 wget抓取实例 抓取网页,主要有url 网址和proxy代理两种方式 1. url 网址方式抓取 (1)curl下载百度首页内容,保存在baidu_html文件中 curl  http://www.baidu.com/  -o  ba

6个常用Excel函数,帮你进一步提升工作效率,职场必备!

我们处理Excel数据报表时候,经常因为对函数的不熟练,导致我们在插入函数时候出现不显示情况. 那么我们如何才能避免这些情况呢?不用担心今天为大家整理了6个我们办公常用到的Excel函数,学会巧妙使用它们轻松帮你进一步提升工作效率,职场必备良品之一! 获取日期里面是星期几 大家都是到在Excel里面获取日期是[Ctrl+:],但却并不知道如何才能从日期里面获取今天是周几,这时候不妨试试这个函数公式. 获取星期函数公式=TEXT(A2,"AAAA") 获取数据排名 如何才能将Excel里

云-腾讯云:腾讯云

ylbtech-云-腾讯云:腾讯云 腾讯云—腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算.大数据.人工智能服务,以及定制化行业解决方案. 1.返回顶部 1. 腾讯云有着深厚的基础架构,并且有着多年对海量互联网服务的经验,不管是社交.游戏还是其他领域,都有多年的成熟产品来提供产品服务.腾讯在云端完成重要部署,为开发者及企业提供云服务.云数据.云运营等整体一站式服务方案. 具体包括云服务器.云存储.云数据库和弹性web引擎等基础云服务:腾讯云分析(MTA

DB-Engines 2017年3月数据库排名发布,呈大面积掉分趋势

近日,DB-Engines发布了2017年3月数据库排名. 前十名中,前三把交椅仍由数据库三大巨头--Oracle.MySQL以及Microsoft SQL Server占据,其中具体排名情况依旧是Oracle居首,占据霸主地位,MySQL和Microsoft SQL Server依次位列二三名. 此次排行的一大关注点在于数据库得分的普遍下降,而这一点在排名前三十的数据库中有突出体现.在前三位数据库中,除了Microsoft SQL Server得分有4.04分的增长之外,位列第一.第二的Ora

闪电精灵SEO 打破百度快速排名规则

我们许多站长们都是每天为了自己网站的排名操碎了心,然而纵使每天苦逼的更新网站,做外链,排名未必上得去,度娘总是不给面子,排名优化做的太慢.但是你可知道有一种方法能够在7-30天内快速提高网站排名吗?或者听说过但不会做? 百度快速排名原理 快速排名,顾名思义,就是利用某些搜索引擎的算法以及特点对优化的网站进行特殊的优化操作,在短时间内达到排名迅速上升的目的.是根据搜索引擎的一系列算法,提升优化网站用户体验,使搜索引擎认为这是一个很受欢迎的站点,达到快速排名效果. 真的可以做到7天快速排名吗? 这也

2015 年度新增开源软件排名TOP100

本榜单包含 2015 年开源中国新收录的 5977 款开源软件中,根据软件本身的关注度.活跃程度进行排名前 100 名的软件.从这份榜单中或许可以了解到最新业界的趋势. 1.SwitchyOmega 项目简介:SwitchyOmega 是 SwitchySharp 的新版本.这是一个 Chrome 浏览器用来切换不同代理的插件.SwitchyOmega 初次安装时会检查是否存在 SwitchySharp ,如果有的话则会自动升级设置,无须手动配置.如果您使用的是非谷歌应用商店版,或者无法自动升级

HDU 4870 Rating(概率、期望、推公式) &amp;&amp; ZOJ 3415 Zhou Yu

其实zoj 3415不是应该叫Yu Zhou吗...碰到ZOJ 3415之后用了第二个参考网址的方法去求通项,然后这次碰到4870不会搞.参考了chanme的,然后重新把周瑜跟排名都反复推导(不是推倒)四五次才上来写这份有抄袭嫌疑的题解... 这2题很类似,多校的rating相当于强化版,不过原理都一样.好像是可以用高斯消元做,但我不会.默默推公式了. 公式推导参考http://www.cnblogs.com/chanme/p/3861766.html#2993306 http://www.cn