按使用天数分类的个人条目数

Number of entries by individual by day of use

我有一个包含两列的 table,用户名和日期。每个用户名都是独立的,每个日期代表一个条目:

+----------+------------+
| 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 |
+----------+------------+

编辑:所以阿尔伯特在“2014-11-20”有两个条目,这被认为是他的第一天。

我的objective是按个人每天按报条目数。例如,如果将“2014-11-20”视为阿尔伯特节,我可以翻译为 'Albert' 在他的第一天有两个条目,一个在他的第二天和一个在他的第三天。

所以,我的结果查询应该 return:

+----------+------+
| 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'。同样的逻辑也适用于 Albert 的最后一个条目,在第一个条目之后两天。

如果有任何指南、参考或查询本身,我将不胜感激,我需要根据此信息创建报告。我正在努力,但我无法弄清楚这个查询...... 感谢您的关注!

首先创建一个 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;这是一个保留字。

您想 select 用户名和日期的出现次数按用户名和日期分组

select [UserName], COUNT([Date]) as [Date] from [table] group by [UserName], [Date]