按使用日期的个人参赛人数

时间:2015-12-01 17:25:49

标签: sql sql-server sql-server-2014

我有一个包含两列的表,UserName和Date。每个UserName都是个体,每个Date代表一个条目:

+----------+------------+
| UserName |    Date    |
+----------+------------+
| Albert   | 2014-11-20 |
| Albert   | 2014-11-20 |
| Albert   | 2014-11-21 |
| Albert   | 2014-11-22 |
| Barbara  | 2015-02-14 |
| Barbara  | 2015-02-14 |
| Barbara  | 2015-02-15 |
| Carlos   | 2015-05-27 |
| Carlos   | 2015-05-29 |
+----------+------------+
编辑:所以Albert在2014-11-20'中有两个条目,这被认为是他的第一天。

我的目标是在每天按个人报告个人的条目数。例如,如果考虑' 2014-11-20'作为阿尔伯特的一天,我可以翻译阿尔伯特'在他的第一天有两个条目,第二天有一个,第三天有一个。

因此,我的结果查询应返回:

+----------+------+
| UserName | Date |
+----------+------+
| Albert   |    1 |
| Albert   |    1 |
| Albert   |    2 |
| Albert   |    3 |
| Barbara  |    1 |
| Barbara  |    1 |
| Barbara  |    2 |
| Carlos   |    1 |
| Carlos   |    3 |
+----------+------+
编辑:那么,对于艾伯特来说,例如,自2014-11-20'被认为是他的第一天,那个日期将相当于1.在这种情况下,他在第一天有两个条目,这解释了' 1,1'。在接下来的一天里,他又有一次参赛。由于它是在第一天之后的一天,这相当于2,这解释了' 1,1,2'。艾伯特的最后一次录入也是如此,在第一次录入后两天。

我很感激任何指南,参考或查询本身,我需要根据这些信息创建一个报告。我努力了,但我无法弄清楚这个问题...... 感谢您的关注!

2 个答案:

答案 0 :(得分:1)

首先创建一个CTE以获得与每个组的第一个日期匹配的行号。

然后加入计算DateDiff

SQL Fiddle Demo

with cte as (
     SELECT row_number() over (partition by [UserName] order by [Date]) as rn,
            *
     FROM users
    )
SELECT c2.rn, 
       c2.[UserName],  
       DATEDIFF(day, c1.[Date],c2.[Date]) + 1 as [Date]
from cte c1
JOIN cte c2
  ON c1.UserName = c2.UserName
 AND c1.rn <= c2.rn
WHERE c1.rn = 1 

<强>输出

| rn | UserName | Date |
|----|----------|------|
|  1 |   Albert |    1 |
|  2 |   Albert |    1 |
|  3 |   Albert |    2 |
|  4 |   Albert |    3 |
|  1 |  Barbara |    1 |
|  2 |  Barbara |    1 |
|  3 |  Barbara |    2 |
|  1 |   Carlos |    1 |
|  2 |   Carlos |    3 |

但请勿调用变量DATE;这是一个保守的词。

答案 1 :(得分:-1)

您想要选择UserName以及按用户名和日期

分组的日期的出现次数
select [UserName], COUNT([Date]) as [Date] from [table] group by [UserName], [Date]