我有一个包含两列的表,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'。艾伯特的最后一次录入也是如此,在第一次录入后两天。
我很感激任何指南,参考或查询本身,我需要根据这些信息创建一个报告。我努力了,但我无法弄清楚这个问题...... 感谢您的关注!
答案 0 :(得分:1)
首先创建一个CTE以获得与每个组的第一个日期匹配的行号。
然后加入计算DateDiff
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]