在SQL中排名函数

时间:2013-01-12 22:57:23

标签: sql

我的任务是弄清楚成员访问了多少次 在当前访问日期的图书馆。我有以下内容 一个成员的示例记录。例如,在2000年10月1日 (visit_id = 55353)这位成员第一次访问了图书馆, 所以他在2000年10月1日之前有0次访问。然后在2000年12月15日(visit_id = 12355) 这位成员再次访问了图书馆,现在他在12/15/2012之前有一次访问。 该成员再次于01/01/2002(visit_id = 52524)访问了该图书馆 现在他在2002年1月1日之前进行了2次访问。现在继续他最近的访问 访问12/12/2009(visit_id = 45254)该会员有9次访问图书馆。

Member_ID   Date_Visit  Visit_id
12345       2000-10-01  55353
12345       2000-12-15  12355
12345       2002-01-01  52524
12345       2002-01-02  62558
12345       2003-05-30  22287
12345       2003-08-12  82552
12345       2003-09-12  12563
12345       2005-11-25  78785
12345       2008-12-25  98212
12345       2009-12-12  45254

我在下面有一个使用等级函数的脚本,但我被困在第一个 访问和上次访问。请注意,这只是一个成员 示范。实际数据包括许多成员

SELECT
DATE_VISIT,
RANK() OVER (PARTITION BY MEMBER_ID ORDER BY DATE_VISIT) AS Rank
FROM RANKS

DATE_VISIT  Rank
2000-10-01  1
2000-12-15  2
2002-01-01  3
2002-01-02  4
2003-05-30  5
2003-08-12  6
2003-09-12  7
2005-11-25  8
2008-12-25  9
2009-12-12  10

我希望我的输出像这样:

DATE_VISIT  Rank
2000-10-01  0
2000-12-15  1
2002-01-01  2
2002-01-02  3
2003-05-30  4
2003-08-12  5
2003-09-12  6
2005-11-25  7
2008-12-25  8
2009-12-12  9

有谁可以请一看并帮忙?还有其他功能,案例陈述或 修改排名功能使其有效?

3 个答案:

答案 0 :(得分:1)

你试过减去1吗?

SELECT
DATE_VISIT,
RANK() OVER (PARTITION BY MEMBER_ID ORDER BY DATE_VISIT) -1  AS Rank
FROM RANKS

答案 1 :(得分:0)

Select
  Date_Visit,
  Rank - 1
From (    
  Select
    Date_Visit,
    Rank() Over (Partition By Member_Id Order By Date_Visit) AS Rank
   From
     Ranks
  ) x

答案 2 :(得分:0)

您可以尝试以下操作,也可以为排名列使用不同的别名

SELECT DATE_VISIT, (Rnk - 1) NewRnk FROM (
SELECT
DATE_VISIT,
RANK() OVER (PARTITION BY MEMBER_ID ORDER BY DATE_VISIT) AS Rnk
FROM RANKS
)