按使用天数分类的个人条目数
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
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]
我有一个包含两列的 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
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]